从多个 CSV 文件读取并使用流写入一个文件
Reading from multiple CSV files and writing into one using streams
我的程序接收 CSV 文件并尝试将它们合并到一个 CSV 文件中。所有 CSV 文件都将具有相同的列。
我正在使用 fast-csv 包来解析和格式化 CSV 文件的行,但我无法将它们全部连续放入一个文件中。
我正在遍历文件和 运行 解析和格式化行的函数,但输出文件全是无序的,不包含文件中的所有数据。
我认为这是由于我用来遍历不同 CSV 文件参数的“for”循环的同步特性,以及从不同流读取并尝试写入单个流的异步特性。
我正在寻找一些关于如何循环遍历每个文件参数的指导,但在继续下一个文件之前 - 该文件的解析、格式化和写入输出文件已完成。
// Function that parses and formats the given file
function formatFile(paths, index) {
// Initialize format options
let formatOptions = {
quoteHeaders: true,
quoteColumns: true,
escape: '\'
};
// If the current file is the first file, write the headers of the file
if (index === 0) {
formatOptions.headers = true;
// If the current file is not the first file, do not write the headers of the file
} else {
formatOptions.writeHeaders = false;
}
// Take in the current file as a readable stream
fs.createReadStream(paths[index])
// Parse the CSV file
.pipe(csv.parse({ headers: true, escape: '\' }))
// Format the rows of the CSV file
.pipe(csv.format(formatOptions))
// Pipe the formatted data into the output CSV file
.pipe(outputFile);
}
// Loop through each CSV file argument and run the formatFile function on each
for (let i = 0; i < filePaths.length; i++) {
formatFile(filePaths, i);
}
使用承诺。
// Function that parses and formats the given file
function formatFile(paths, index) {
// Initialize format options
let formatOptions = {
quoteHeaders: true,
quoteColumns: true,
escape: '\'
};
// If the current file is the first file, write the headers of the file
if (index === 0) {
formatOptions.headers = true;
// If the current file is not the first file, do not write the headers of the file
} else {
formatOptions.writeHeaders = false;
}
// Take in the current file as a readable stream
const stream = fs.createReadStream(paths[index])
// Parse the CSV file
.pipe(csv.parse({ headers: true, escape: '\' }))
// Format the rows of the CSV file
.pipe(csv.format(formatOptions))
// Pipe the formatted data into the output CSV file
.pipe(outputFile);
return new Promise(resolve => stream.on('finish', resolve))
}
// Loop through each CSV file argument and run the formatFile function on each
for (let i = 0; i < filePaths.length; i++) {
await formatFile(filePaths, i);
}
包含 for 循环的函数必须是异步函数。
我的程序接收 CSV 文件并尝试将它们合并到一个 CSV 文件中。所有 CSV 文件都将具有相同的列。
我正在使用 fast-csv 包来解析和格式化 CSV 文件的行,但我无法将它们全部连续放入一个文件中。
我正在遍历文件和 运行 解析和格式化行的函数,但输出文件全是无序的,不包含文件中的所有数据。
我认为这是由于我用来遍历不同 CSV 文件参数的“for”循环的同步特性,以及从不同流读取并尝试写入单个流的异步特性。
我正在寻找一些关于如何循环遍历每个文件参数的指导,但在继续下一个文件之前 - 该文件的解析、格式化和写入输出文件已完成。
// Function that parses and formats the given file
function formatFile(paths, index) {
// Initialize format options
let formatOptions = {
quoteHeaders: true,
quoteColumns: true,
escape: '\'
};
// If the current file is the first file, write the headers of the file
if (index === 0) {
formatOptions.headers = true;
// If the current file is not the first file, do not write the headers of the file
} else {
formatOptions.writeHeaders = false;
}
// Take in the current file as a readable stream
fs.createReadStream(paths[index])
// Parse the CSV file
.pipe(csv.parse({ headers: true, escape: '\' }))
// Format the rows of the CSV file
.pipe(csv.format(formatOptions))
// Pipe the formatted data into the output CSV file
.pipe(outputFile);
}
// Loop through each CSV file argument and run the formatFile function on each
for (let i = 0; i < filePaths.length; i++) {
formatFile(filePaths, i);
}
使用承诺。
// Function that parses and formats the given file
function formatFile(paths, index) {
// Initialize format options
let formatOptions = {
quoteHeaders: true,
quoteColumns: true,
escape: '\'
};
// If the current file is the first file, write the headers of the file
if (index === 0) {
formatOptions.headers = true;
// If the current file is not the first file, do not write the headers of the file
} else {
formatOptions.writeHeaders = false;
}
// Take in the current file as a readable stream
const stream = fs.createReadStream(paths[index])
// Parse the CSV file
.pipe(csv.parse({ headers: true, escape: '\' }))
// Format the rows of the CSV file
.pipe(csv.format(formatOptions))
// Pipe the formatted data into the output CSV file
.pipe(outputFile);
return new Promise(resolve => stream.on('finish', resolve))
}
// Loop through each CSV file argument and run the formatFile function on each
for (let i = 0; i < filePaths.length; i++) {
await formatFile(filePaths, i);
}
包含 for 循环的函数必须是异步函数。