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 );
};

次のようなデータがない場合、配列にnullを入れることができるように修正しようとしています

[[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 );
};

配列内でnullではなくnullを取得する方法を教えてください。

基本的に、これを実行できるようにデータ構造を正しく取得しようとしています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

次のアイテムの空の配列を事前にプッシュする代わりに、各アイテムの配列を作成してプッシュするだけで、アイテムの代わりにnull値をプッシュするのは簡単です。

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 古いブラウザ用のshim はこちらArray.map

于 2012-10-27T18:19:00.917 に答える