【问题标题】:Node.js filter/extract subset of data from csv / JSONNode.js 从 csv / JSON 过滤/提取数据子集
【发布时间】:2017-01-04 22:55:43
【问题描述】:

我正在尝试从 csv 文件中提取信息,该文件有很多行,我想只返回特定行中的一些值/列。我使用 papa/babyparse 将 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' } ]
...

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

理想情况下,我可以使用变量通过 Req 过滤“行”(这是我从另一个函数获得的输入),然后从这个“行”查询其他键/值对,因为我想实现根据数据做出不同的反应。

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

【问题讨论】:

  • 你只需要单行的值吗?
  • @cbronson 是的

标签: javascript json node.js papaparse


【解决方案1】:

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

你也可以使用 Promise:

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

希望对你有帮助

【讨论】:

  • 感谢您的快速回复,但我收到一条错误消息:TypeError: reader.on is not a function
  • 操作。我现在更改了变量。
  • 您可以在代码中添加条件。我放了一个与行数相关的条件,但是你可以换成另一种条件
  • 干杯。抱歉,如果它对您来说有点傻,但是我将如何测试文件中的特定值? “如果(jsonFromLine.req == 'RQ0191223')”似乎不起作用
  • 我现在如何将它打包到一个可以从另一个脚本调用的函数中?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-04
  • 2020-10-22
  • 2018-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多