假设我有如下代码:
const fs = require('node:fs')
const csvParser = require('csv-parser')
const rs = fs.createReadStream(dir)
const ws = fs.createWriteStream(outDir)
ws.write('[' + 'n')
rs.pipe(
csvParser({
mapHeaders: mapper,
}),
)
.on('data', (data) => {
ws.write('t' + JSON.stringify({ ...data, provider } + ',n'))
})
.on('end', () => {
ws.write(']')
console.log('writing to a file has been completed >> ', OUT_DIR)
})
基本上这段代码所做的是从大型csv文件中读取,然后将其流写入json文件。如代码中所示,我为每行附加',n'作为分隔符,以便在流处理完成后格式化所有json代码。
这种方法的问题是,它在每个条目的末尾留下逗号,每次文档写入完成时,您都必须手动格式化文件(即删除末尾的逗号)。
例如,结果将是这样的:
[
{"key1":"value1", "key2":"value2"},
{"key1":"value1", "key2":"value2"}, // <- note the trailing comma here.
]
对于末尾逗号的处理有什么建议吗?另外,处理读写流更好的替代方法是什么,请让我知道。提前谢谢。
我会把这个问题颠倒过来,在除第一项以外的每一项前都加上逗号。
let first = true;
ws.write('[' + 'n')
// ...
.on('data', (data) => {
if (!first) {
ws.write(',n');
}
first = false;
ws.write('t' + JSON.stringify({ ...data, provider }))
})
[EDIT]正如在评论中提到的,这违背了使用流的目的。不要在非常大的文件上使用这个
我不会处理尾随昏迷,但这里是我将如何做。其思想是将每一行推入一个数组,并将JSON.stringify()
推入整个数组。
像这样
const rows = []
rs.pipe(
csvParser({
mapHeaders: mapper,
}),
)
.on('data', (data) => {
rows.push({ row content })
})
.on('end', () => {
ws.write(JSON.stringify(rows))
console.log('writing to a file has been completed >> ', OUT_DIR)
})
可能有更好的方法,但我想这样做:
const fs = require('node:fs')
const csvParser = require('csv-parser')
const rs = fs.createReadStream(dir)
const ws = fs.createWriteStream(outDir)
let buffer = null;
ws.write('[' + 'n')
rs.pipe(
csvParser({
mapHeaders: mapper,
}),
)
.on('data', (data) => {
if (buffer) {
ws.write(buffer + ',n'))
}
buffer = 't' + JSON.stringify({ ...data, provider })
})
.on('end', () => {
ws.write(buffer + 'n'))
ws.write(']')
console.log('writing to a file has been completed >> ', OUT_DIR)
})