Node.js filter/extract 来自 csv 的数据子集 / JSON

Node.js filter/extract subset of data from csv / JSON

我正在尝试从 csv 文件中提取信息,该文件有很多行,我想 return 仅从特定行中提取一些 values/columns。我使用 papa/babyparse 将 csv 文件转换为 JSON 但很难转换为 display/extract 特定行。

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' } ]
...

我尝试将 row.data.req 用于我的 "if",但得到了 "undefined"。还尝试使用 .filter.hasOwnProperty 但不知何故我似乎错过了一些东西(也在 if 之前尝试 JSON.stringify 但没有成功)。经过数小时的跟踪、错误和谷歌搜索后,我想我在这里问。

理想情况下,我可以使用一个变量通过 Req 过滤 "row"(这是我从另一个函数获得的输入),然后从这个 [=32] 中查询其他 key/value 对=] 因为我想根据数据实施不同的响应。

我不得不承认我对此很陌生,感谢您的支持。非常感谢

我相信您不需要为此使用解析器。只需要使用 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 
});

这对我来说很好

编辑.2:

您也可以使用 promises:

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

希望对你有帮助