2017-01-03 29 views
3

ファイルが多数の行を持ち、特定の行から一部の値/列のみを返したいと考えています。私はpapa/babyparseを使用してcsvファイルをJSONに変換しますが、特定の行を表示/抽出するのには苦労します。Node.js csv/JSONからのデータのサブセットをフィルタリング/抽出します

var baby = require('babyparse'); 

var csv2 = baby.parseFiles("netreqs.csv",{ 
     header:true, 
     skipEmptyLines: true, 
     step: function(row) { 
      console.log("Row:", row.data); 

     }, 
     complete: function() { 
      console.log("All done!"); 
     } 
}); 

出力がうまくいくように見えるのはJSONです。

Row: [ { Req: 'RQ0342384', 
    'Requestor country': 'UK', 
    ReqType: 'other', 
    'ATOS Approved': '21.09.2016', 
    Urgent: 'No', 
    Assignee: 'Hans Gans', 
    'Change number': 'NA', 
    'Implementation Date': '', 
    'Change fully approved': 'No', 
    'Completion Date': '', 
    'Req Closed': 'No' } ] 
    Row: [ { Req: 'RQ0343423', 
    'Requestor country': 'US', 
    ReqType: 'Firewall', 
    'ATOS Approved': '04.11.2016', 
    Urgent: 'No', 
    Assignee: 'Peter Mueller', 
    'Change number': 'C9343449', 
    'Implementation Date': '', 
    'Change fully approved': 'No', 
    'Completion Date': '31.01.2017', 
    'Req Closed': 'No' } ] 
... 

私は私の「if」のためrow.data.reqを使用しますが、「未定義」のバックを取得しようとしました。また.filter.hasOwnPropertyと試してみましたが、なんとか私は何かを見逃しているようです(もし成功していなければJSON.stringifyにも挑戦しました)。多くの時間のトレイルの後に&エラーとグーグルで私はここで尋ねると思った。

Idealy私は、Req(これは別の関数から取得した入力です)で「行」をフィルタリングするために変数を使用でき、この「行」から他のキー/値のペアをクエリできますデータに基づいて異なる応答を実装する

私はこれについてかなり新しいことを認めなければなりません、あなたのサポートに感謝します。多くのありがとう

+0

に役立ちます願っていますあなたは、単一の行の値が必要ですか? – cbronson

+0

@cbronsonはい正確に – DPM

答えて

0

私はあなたがそれのためにパーサを使う必要はないと信じています。 readLineを使用するだけです:

var output = []; 
var count = 0 

var lineReader = require('readline').createInterface({ 
    input: require('fs').createReadStream('file.csv') 
}); 

lineReader.on('line', function (line) { 
    var jsonFromLine = {}; 

    if (count == 2) { // this is my conditional. Set line 2 
    var lineSplit = line.split(','); 
    // select columns you want 
    jsonFromLine.column0 = lineSplit[0]; 
    jsonFromLine.column1 = lineSplit[1]; 
    // ... 
    output.push(jsonFromLine); 
    } 
    count++; 
}); 

lineReader.on('close', function (line) { 
    console.log(output); // list output 
}); 

私はそれが役に立ちそうです。

編集:

あなたが特定の値が必要な場合は、別の条件を設定することができます。

var output = []; 

var lineReader = require('readline').createInterface({ 
    input: require('fs').createReadStream('file.csv') 
}); 

lineReader.on('line', function (line) { 
    var jsonFromLine = {}; 
    var lineSplit = line.split(','); 
    // select columns you want 
    jsonFromLine.req = lineSplit[0]; 
    jsonFromLine.column1 = lineSplit[1]; 
    // ... 
    if (jsonFromLine.req === 'RQ0191223') { 
     output.push(jsonFromLine); 
    } 
}); 

lineReader.on('close', function (line) { 
    console.log(output); // list output 
}); 

これは私には正常に動作します

Edit.2:

約束を使用することもできます:

var method = function() { 
    return new Promise(function(resolve) { 
     var output = []; 
     var lineReader = require('readline').createInterface({ 
      input: require('fs').createReadStream('file.csv') 
     }); 

     lineReader.on('line', function (line) { 
      var jsonFromLine = {}; 
      var lineSplit = line.split(','); 
      // select columns you want 
      jsonFromLine.req = lineSplit[0]; 
      jsonFromLine.column1 = lineSplit[1]; 
      // ... 
      if (jsonFromLine.req === 'RQ0191223') { 
       output.push(jsonFromLine); 
      } 
     }); 

     lineReader.on('close', function (line) { 
      resolve(output); 
     }); 
    }); 
} 


method().then(function(outputOfResolve) { console.log(outputOfResolve); }); 

私はそれが

+0

あなたの速い返信をありがとうが、私はエラーメッセージが表示されます:TypeError:reader.onは関数ではありません – DPM

+0

Ops。変数を変更しました。ありがとうございます。 –

+0

特定の行をどのようにフィルタリングできますか? – DPM

関連する問題