0

下面的函数将一个 csv 文件解析为一个数组,所以它看起来像

[[1,56.79],[2,57.50],[3,71.60],[4,69.10]]

function CSVToArray (csvString) {

    var arrData = [[]];

    var rows = csvString.match(/[^\r\n]+/g);
    var len = rows.length
    for (var i=0; i<len; ++i) 
    {

        var cols = rows[i].split(",")
        arrData[ arrData.length - 1 ].push( parseFloat(cols[0]) );
        arrData[ arrData.length - 1 ].push( parseFloat(cols[1]) );
        if (i<(len-1))
        {
            arrData.push( [] );
        }
    }

    return( arrData );
};

我正在尝试修改它,以便如果没有类似的数据,我可以在数组中包含空值

[[1,56.79],[2,57.50],null,[3,71.60],null,[4,69.10]]

我尝试了以下但无法使其正常工作

function CSVToArray (csvString) {

    var arrData = [[]];

    var rows = csvString.match(/[^\r\n]+/g);
    var len = rows.length
    for (var i=0; i<len; ++i) 
    {

        var cols = rows[i].split(",")
        if (cols[1] != "")
        {
        arrData[ arrData.length - 1 ].push( parseFloat(cols[0]) );
        arrData[ arrData.length - 1 ].push( parseFloat(cols[1]) );
        arrData.push( [] );
        }
        else
        {
        arrData.push( null);
        }
    }

    return( arrData );
};

请有人能告诉我如何在数组中得到一个空值而不是一个空值吗?

本质上,我试图让数据结构正确,以便能够做到这一点http://jsfiddle.net/KhpCE/1/

4

3 回答 3

2

用这个:

function CSVToArray (csvString) {
    var arrData = [];
    var rows = csvString.split(/\r?\n/);
    // console.log(rows)
    var len = rows.length
    for (var i=0; i<len; ++i) 
    {
        var cols = rows[i].split(",")
        // console.log(cols)
        var temp = []
        if (cols.length == 2 && cols[1] != "" && cols[0] != "")
        {
          temp.push( parseFloat(cols[0]) );
          temp.push( parseFloat(cols[1]) );
        }
        else
        {
          temp = null;
        }
        arrData.push(temp);
    }
    return( arrData );
};
于 2012-10-27T18:14:30.610 回答
1

无需预先为下一个项目推送一个空数组,只需为每个项目创建一个数组并推送它,然后推送一个空值而不是一个项目很简单:

function CSVToArray (csvString) {

  // an array without the prefilled empty item array
  var arrData = [];

  var rows = csvString.match(/[^\r\n]+/g);
  var len = rows.length
  for (var i=0; i<len; ++i) {
    var cols = rows[i].split(",");
    if (cols[1] != "") {
      // create an array and push it
      arrData.push([
        parseFloat(cols[0]),
        parseFloat(cols[1])
      ]);
    } else {
      arrData.push(null);
    }
  }

  return arrData;
}
于 2012-10-27T18:05:07.647 回答
1

这是match困扰你的。匹配的结果/[^\r\n]+/g从 中丢失空行csvString。我建议split在这里使用。

此外,您的代码看起来相当庞大。如何使用Array.map1

function CSVToArray(csvString) {
    var rows = csvString.split(/\n|\r\n/);
      return rows.length ? [rows.map(function(s){
         var cols = s.split(",").map(function(v){return Number(v)||null;});
         return cols.length===2 ? cols: null;
      })] : [];
};
//usage example
CSVToArray('1,2.1\n\n23.2\n3,4\n5.34,6');
//=> [[2,2.1],null,null,[3,4],[5.34,6]]

1 在这里您可以找到Array.map适用于旧版浏览器的 shim

于 2012-10-27T18:19:00.917 回答