【问题标题】:Best method of getting Javascript data from a simple 3-row CSV从简单的 3 行 CSV 获取 Javascript 数据的最佳方法
【发布时间】:2011-09-16 01:11:23
【问题描述】:

我有一个简单的 CSV(使用 JQuery 的 $.ajax 从同一站点上的 /data/league.csv 导入),其中三行格式完全相同:

"Kimberlin Library","Queen's Building","Innovation Centre","etc etc"
8,2,0,-2
1,0,-1,0

我想采用这种格式(使用 buildingpercent 作为 Highcharts 中 x-y 轴的数据,并使用所有三个填充列表):

var leaguetable = {
    building: ["Kimberlin Library","Queen's Building","Innovation Centre","etc etc"],
    percent: [8,2,0,-2],
    change: [1,0,-1,0]
};

微不足道的尴尬,但我一直在画一个空白,尽管尝试了其他人的方法(包括split(/\r\n|\n|r/),搜索/^(.*)$/m)和this question),所以准备从头开始。我需要尽可能简单的东西,无论是 JQuery 还是纯 Javascript。对于类似的问题,我最终将文件转换为 JSON,但如果可能的话,我想避免这种情况。

【问题讨论】:

  • 如何导入 CSV?
  • 我只是好奇;你为什么要那种格式?当您实际对数据进行处理时,我想使用包含数据的对象数组而不是包含包含数据的数组的对象会更好。
  • 您能发布一个 CSV 样本吗? CSV 有很多不同的种类,发布示例可能会有所帮助。
  • 为什么不使用这样的东西呢? code.google.com/p/js-tables/wiki/CSV
  • @Wes,Jonathan M:见上文; icktoofay:我直接在 Highcharts 中使用数组作为坐标轴; Jonathan M:我通常只问我是否真的被卡住了,但最终自己回答了一些问题;铁杉:感谢您的链接

标签: javascript json csv


【解决方案1】:

试试这个。它将通过下面代码中的正则表达式模式处理简单的 CSV 和单引号或双引号 CSV。你必须调整processCSV() 的结尾来做你想做的事,因为我只是把对象归还给稀薄的空气。

$(document).ready(function() {
    $.ajax({
        type: "GET",
        url: "my_csv.txt",
        dataType: "text",
        success: function(data) {processCSV(data);}
     });
 });

function processCSV(allLines) {
    var allLinesArray = allLines.split(/\r\n|\n/);
    var leaguetable = { 'building': [], 'percent': [], 'change': [] };
    var pattern = /([^,'"]*"[^"]*"[^,'"]*)|([^,'"]*'[^']*'[^,'"]*)|([^,"']*)/ig;
    var fieldValues;

    for (var i=0; i<allLinesArray.length; i++) {
        fieldValues = allLinesArray[i].match(pattern);
        if (fieldValues) {
            for (var j=0; j<fieldValues.length; j++) {
                // if begins with single- or double-quote, strip specified quotes
                if (fieldValues[j].charAt(0) === '"' || fieldValues[j].charAt(0) === "'") {
                    fieldValues[j] = fieldValues[j].replace(fieldValues[j].substr(0,1), "");
                }
            }
            // I'll trust your CSV to have the right number of fields, but...
            // you may want to build some validation in before doing the next 3 lines
            leaguetable.building.push(fieldValues[1]);
            leaguetable.percent.push(fieldValues[2]);
            leaguetable.change.push(fieldValues[3]);
        }
    }
    return leaguetable;
}

【讨论】:

  • 因为提供的 CSV(用于为期一周的公开展示)需要大量编辑(没有引号、标题作为值、剩余字段等),我最终手动将值分为两个数组。当我们开始更新项目时,这将很有用。仅供参考,这是项目:gogreenweek.dmu.ac.uk
  • @Jonathan M 这个解析器会为这个 CSV 文件工作dl.dropbox.com/u/19509627/SampleDataClean.csv
  • @bouncingHippo,您需要修改代码,因为变量 leaguetable 是专门为这个问题设计的。
  • @JonathanM 你介意看看我的 CSV 解析问题吗stackoverflow.com/questions/14442398/…
【解决方案2】:

假设您的 CSV 很简单,您可能想要执行以下操作:

  1. 将数据分成几行。
  2. 遍历行:
    1. 用逗号分隔行。
    2. 将第一部分附加到building 数组。
    3. 在使用parseInt 解析后,将第二部分附加到percent 数组。
    4. 对第三部分和change 数组执行相同操作。

【讨论】:

  • 如果它是一个引用的 CSV,例如包含诸如“我,克劳迪斯”之类的数据作为书名,这将不起作用。但这就是您之前要求提供 CSV 样本的观点。
  • @Jonathan:这就是为什么我用“假设 CSV 很简单”来限定我的答案。
猜你喜欢
  • 2022-01-26
  • 2012-09-22
  • 1970-01-01
  • 2011-10-11
  • 2016-08-27
  • 2016-08-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多