jQuery / JavaScript - 将CSV转换为数组

时间:2016-10-26 21:55:53

标签: javascript jquery arrays ajax csv

我正在尝试将CS​​V文件转换为javascript数组。

这是我的代码:

var segments = {
    'Segment_1':'inves_cast',
    'Segment_2':'foreged_prod',
    'Segment_3':'air_prod',
    'Segment_5':'worldwide',
    'Segment_6':'structurals'
};

var divisions = {
    'Division_1':'structurals',
    'Division_2':'airfoils',
    'Division_3':'wyman',
    'Division_4':'energy',
    'Division_5':'fasteners',
    'Division_6':'struc_comp',
    'Division_7':'mech_hard',
    'Division_8':'engine_prod',
    'Division_9':'corp',
    'Division_10':'aero',
    'Division_11':'timet',
    'Division_12':'',
    'Division_13':'spec_metals',
};

var csv = $.get('/path/to/locations.csv');

console.log(csv);

var locationArray = transformLocationData(csv);

function transformLocationData(obj) {
    var lineArray = [];
    if(obj && obj.data) {
        var text = (data.responseText);
        lines = text.split('\n');
        for(var line in lines) {
            var lineTokens = line.split(',');
            lineArray = [
                lineTokens[0],
                lineTokens[1],
                lineTokens[3],
                lineTokens[4],
                lineTokens[5],
                lineTokens[6],
                lineTokens[11],
                lineTokens[12],
                lineTokens[13],
                lineTokens[14],
                lineTokens[15],
                segments['Segment_' + lineTokens[8]],
                divisions['Division_' + lineTokens[9]]
            ];
        }
    }
    console.log(lineArray);
}

所以我要做的是使用AJAX来获取csv文件然后拆分" responseText" 首先逐行第二次循环遍历这些行并用逗号分隔,然后根据这些行号创建一个数组。

以下是我从AJAX调用中获取的数据的图片: enter image description here

使用最后一个控制台日志(console.log(lineArray);)它会返回一个空数组,或者它只返回var lineArray = [];中的数据,如果我用数据var lineArray = ["Lexus", "Audi", "BMW"];填充它,它就是空的将返回该数组。

这是一个包含所有代码的plunker:https://plnkr.co/edit/CoZGfr6S9R5LDqR1drzq

我知道我做错了什么但似乎无法得到它。我不熟悉这样的事情,所以任何帮助都会受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

您每次都使用新阵列替换lineArray,而您只是在循环的 end 处记录数组。也许CSV最后有一个空行。

如果您想要一个数组数组,请改为:

var lineArray = [];
if(obj && obj.data) {
    var text = (data.responseText);
    lines = text.split('\n');
    for(line in lines) {
        var lineTokens = line.split(',');
        lineArray.push([
            lineTokens[0],
            lineTokens[1],
            lineTokens[3],
            lineTokens[4],
            lineTokens[5],
            lineTokens[6],
            lineTokens[11],
            lineTokens[12],
            lineTokens[13],
            lineTokens[14],
            lineTokens[15],
            segments['Segment_' + lineTokens[8]],
            divisions['Division_' + lineTokens[9]]
        ]);
    }
}
console.log(lineArray);

<强>更新

此外,您还没有正确处理Ajax请求的结果。这一行:

var csv = $ .get(&#39; /path/to/locations.csv');

...不会返回CSV。相反,它返回一个Promise(有点......)。所以你不能那样解析csv。相反,等待结果。将您的代码更改为:

$.get('/path/to/locations.csv').then(function (csv) {
  var locationArray = transformLocationData(csv);
}, function (err) {
  // Handle errors
});

正如@vlaz所提到的,您还希望将循环从for..in更改为常规for循环:

for (var i = 0; i < lines.length; i++) {
  var line = lines[i];
  // ...
}