我使用node-csv解析了一堆带有节点的csv文件。我有数百个需要解析的文件,但是,我需要在每个文件中添加一个标题行,以利用解析器中的'columns'选项。 columns选项将每一行解析为一个对象,并将标题行作为对象键,但是要使此选项起作用,您当然需要一个标题行。
通过查看文档,我的直觉告诉我,我应该能够通过添加行的转换函数来管道我的节点流,但是我很难在不改变文件中的现有数据的情况下完成这项工作。
这是我在想的,但是如何在“零”列中写一行?
let createStream = function() {
let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'});
let parser = csv.parse({columns: true});
let transform = csv.transform(function(record, doneTransform){
//check if first zero row,
//Add header column.
doneTransform();
});
return stream.pipe(transform).pipe(parser);
};
createStream().on('data', function(transaction){
//do stuff with object data
});
答案 0 :(得分:3)
真正的解决方案:
let createStream = function() {
let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'});
let parser = csv.parse({skip_empty_lines: false, auto_parse: true, columns: header});
return stream.pipe(parser);
};
createStream().on('data', function(transaction){
q.push(transaction);
});
答案 1 :(得分:0)
我通过稍微不同地看待问题来解决这个问题。让我解释。
首先,我上面的初步尝试没有用,因为它错误地使用了Transform和Parse包。您可以单独使用它们,如软件包建议的那样,但是如果您决定一起使用它们,正确的用法要求您首先解析CSV,然后转换它...因此,我上面的尝试在到达时已经死了。
其次,一旦我退出了使用标题的要求,我意识到我真正想要的是一个具有正确键/值对的对象,这导致我尝试自己转换数据,而不是依赖在'列上'为我这样做的选择。
这导致我的结果:如果我可以保证每个记录的顺序和列数,那么可以在转换函数中使用相应数据从两个数组构建一个对象。
以下是代码:
}
'头'是一组键我希望与我从CSV解析的相应值配对。
我正在使用lodash的zipObject函数,该函数从两个数组创建一个Object。你可以在这里找到:zipObject。
希望这有助于有人在他们的CSV文件上没有标题时找到他们的解决方案。