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); });
希望对你有帮助
我正在尝试从 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); });
希望对你有帮助