Javascript 如何使用节点CSV将标题行添加到CSV文件?
我正在使用node解析一堆csv文件。我有数百个需要解析的文件,但是,我需要为每个文件添加一个标题行,以利用解析器中的“columns”选项。columns选项将每一行解析为一个对象,标题行用作对象键,但是要使此选项起作用,您当然需要标题行 通过查看文档,我的直觉告诉我,我应该能够通过一个添加行的转换函数来传递节点流,但在不改变文件中现有数据的情况下,我很难做到这一点 下面是我的想法,但是我如何将一行写入“零”列Javascript 如何使用节点CSV将标题行添加到CSV文件?,javascript,node.js,csv,Javascript,Node.js,Csv,我正在使用node解析一堆csv文件。我有数百个需要解析的文件,但是,我需要为每个文件添加一个标题行,以利用解析器中的“columns”选项。columns选项将每一行解析为一个对象,标题行用作对象键,但是要使此选项起作用,您当然需要标题行 通过查看文档,我的直觉告诉我,我应该能够通过一个添加行的转换函数来传递节点流,但在不改变文件中现有数据的情况下,我很难做到这一点 下面是我的想法,但是我如何将一行写入“零”列 let createStream = function() { let st
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
});
我通过稍微不同地看待这个问题来解决这个问题。让我解释一下 首先,我上面的初始尝试没有成功,因为它错误地使用了转换和解析包。正如软件包所建议的,您可以单独使用它们,但如果您决定将它们一起使用,正确的使用要求您首先解析您的CSV,然后对其进行转换……因此,我上面的尝试是徒劳的 其次,一旦我放弃了使用头的要求,我意识到我真正想要的是一个具有正确键/值对的对象,这导致我尝试自己转换数据,而不是依赖“列”选项来完成这项工作 这导致了我的结果:如果我能够保证每个记录的顺序和列数,那么就可以从两个数组中构建一个对象,并在转换函数中使用相应的数据 代码如下:
let createStream = function() {
let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'});
let parser = csv.parse({skip_empty_lines: false, auto_parse: true});
let transform = csv.transform(function(record, doneTransform){
let newObject = _.zipObject(header, record);
doneTransform(null, newObject);
});
return stream.pipe(parser).pipe(transform);
};
createStream().on('data', function(transaction){
q.push(transaction);
});
“header”是我希望与从CSV解析的相应值配对的密钥数组
我正在使用lodash的zipObject函数,该函数从两个数组创建一个对象。您可以在这里找到:
希望这能帮助那些CSV文件上没有标题的人找到解决方案 我通过稍微不同地看待这个问题来解决这个问题。让我解释一下 首先,我上面的初始尝试没有成功,因为它错误地使用了转换和解析包。正如软件包所建议的,您可以单独使用它们,但如果您决定将它们一起使用,正确的使用要求您首先解析您的CSV,然后对其进行转换……因此,我上面的尝试是徒劳的 其次,一旦我放弃了使用头的要求,我意识到我真正想要的是一个具有正确键/值对的对象,这导致我尝试自己转换数据,而不是依赖“列”选项来完成这项工作 这导致了我的结果:如果我能够保证每个记录的顺序和列数,那么就可以从两个数组中构建一个对象,并在转换函数中使用相应的数据 代码如下:
let createStream = function() {
let stream = fs.createReadStream(transPath+'/'+file, {encoding: 'utf8'});
let parser = csv.parse({skip_empty_lines: false, auto_parse: true});
let transform = csv.transform(function(record, doneTransform){
let newObject = _.zipObject(header, record);
doneTransform(null, newObject);
});
return stream.pipe(parser).pipe(transform);
};
createStream().on('data', function(transaction){
q.push(transaction);
});
“header”是我希望与从CSV解析的相应值配对的密钥数组
我正在使用lodash的zipObject函数,该函数从两个数组创建一个对象。您可以在这里找到:
希望这能帮助那些CSV文件上没有标题的人找到解决方案 真正的解决方案:
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);
});
真正的解决办法是:
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);
});
感谢您添加此解决方案。我同意你的观点,这是一个更好的解决方案。谢谢你添加这个解决方案。我同意你的看法,这是一个更好的解决办法。