以不同的方式处理第一行,然后将其余行通过管道传递给 csv 解析器

Process the first row differently then pipe the rest to csv-parser

提问人:iDaniel19 提问时间:3/10/2023 更新时间:3/11/2023 访问量:405

问:

我有一个格式如下的 CSV 文档:

NOT_HEADER1|NOT_HEADER2|NOT_HEADER3...
HEADER1|HEADER2|HEADER3|HEADER4|HEADER5|HEADER6
VALUE1|VALUE2|VALUE3|VALUE4|VALUE5|VALUE6

由于第一行不包含实际的标题,我可以通过跳过不包含标题的第一行来很好地解析文件,例如:

import csv from 'csv-parser';
import fs from 'fs';
const results: any = [];

fs.createReadStream('pathToFile')
    .pipe(csv({ separator: '|', skipLines: 1 }))
    .on('headers', (headers) => {
      console.log(headers);
    })
    .on('data', (data) => results.push(data))
    .on('end', () => {
      console.log(results);
    });

不好的部分是我还需要将第一行存储在某个地方。我可以自己解析它,但我不知道如何利用流,提取并保存它,让管道处理剩下的工作。csv-parser

javascript node.js node-streams csv-parser

评论

0赞 Vishnudev Krishnadas 3/11/2023
将第一行解析为标题,然后将其删除。
0赞 iDaniel19 3/11/2023
那不是效率低下吗?
0赞 Vishnudev Krishnadas 3/11/2023
如何?它不会效率低下。
0赞 iDaniel19 3/11/2023
也许我不明白你的意思。你能补充一个答案吗?

答:

1赞 Heiko Theißen 3/11/2023 #1

您可以使用逐行处理输入文件。存储第一行并将所有其他行写入您的流中:readline.createInterfacecsv

var firstLine;
var csvStream = csv({...})
.on("headers", ...)
.on("data", ...)
.on("end", () => {
  console.log(firstLine, results);
});
readline.createInterface({
  input: fs.createReadStream("..."),
  crlfDelay: Infinity
})
.on("line", function(line) {
  if (firstLine) {
    csvStream.write(line);
    csvStream.write("\n");
  } else
    firstLine = line;
})
.on("close", function() {
  csvStream.end();
});

评论

0赞 iDaniel19 3/11/2023
我不知道我怎么直到现在才知道“readline”。谢谢。这里的主要思想是一个流写入另一个流,对吧?你认为这会对性能产生重大影响吗?还有另一种方法可以读取内存中的整个文件并对其进行处理。fs.readFile
1赞 Heiko Theißen 3/11/2023
我预计不会影响性能。但是,在开始任何进一步处理之前读取整个文件可能会损害性能。