提问人:iDaniel19 提问时间:3/10/2023 更新时间:3/11/2023 访问量:405
以不同的方式处理第一行,然后将其余行通过管道传递给 csv 解析器
Process the first row differently then pipe the rest to csv-parser
问:
我有一个格式如下的 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
答:
1赞
Heiko Theißen
3/11/2023
#1
您可以使用逐行处理输入文件。存储第一行并将所有其他行写入您的流中:readline.createInterface
csv
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
我预计不会影响性能。但是,在开始任何进一步处理之前读取整个文件可能会损害性能。
评论