Javascript 如何使用节点CSV将标题行添加到CSV文件?

Javascript 如何使用节点CSV将标题行添加到CSV文件?,javascript,node.js,csv,Javascript,Node.js,Csv,我正在使用node解析一堆csv文件。我有数百个需要解析的文件,但是,我需要为每个文件添加一个标题行,以利用解析器中的“columns”选项。columns选项将每一行解析为一个对象,标题行用作对象键,但是要使此选项起作用,您当然需要标题行 通过查看文档,我的直觉告诉我,我应该能够通过一个添加行的转换函数来传递节点流,但在不改变文件中现有数据的情况下,我很难做到这一点 下面是我的想法,但是我如何将一行写入“零”列 let createStream = function() { let st

我正在使用node解析一堆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
    });

我通过稍微不同地看待这个问题来解决这个问题。让我解释一下

首先,我上面的初始尝试没有成功,因为它错误地使用了转换和解析包。正如软件包所建议的,您可以单独使用它们,但如果您决定将它们一起使用,正确的使用要求您首先解析您的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);
});

感谢您添加此解决方案。我同意你的观点,这是一个更好的解决方案。谢谢你添加这个解决方案。我同意你的看法,这是一个更好的解决办法。