我正在尝试使用fast-csv同步读取多个文件,看起来应该像这样:
read file 1
execute something while reading
read file 2
execute something while reading (it must be execute after first execution's file that's why I need to do this synchronously)
...
这是我的简化代码:
const csv = require('fast-csv');
const PROCEDURES = [
{ "name": "p1", "file": "p1.csv" },
{ "name": "p2", "file": "p2.csv" },
];
const launchProcedure = (name, file) => {
try {
const fs = require("fs");
const stream = fs.createReadStream(file, {
encoding: 'utf8'
});
console.log('launching parsing...');
stream.once('readable', () => {
// ignore first line
let chunk;
while (null !== (chunk = stream.read(1))) {
if (chunk == '\n') {
break;
}
}
// CSV parsing
const csvStream = csv.fromStream(stream, {
renameHeaders: false,
headers: true,
delimiter: ',',
rowDelimiter: '\n',
quoteHeaders: false,
quoteColumns: false
}).on("data", data => {
console.log('procedure execution...');
// I execute a procedure...
}).on("error", error => {
logger.error(error);
}).on("end", data => {
logger.info(data);
});
});
}
catch (e) {
logger.info(e);
}
}
PROCEDURES.forEach(procedure => {
launchProcedure(procedure.name, procedure.file);
});
输出将是:
launching parsing...
launching parsing...
procedure execution...
procedure execution...
问题在stream.once上,但是我用它忽略了第一行。我试图使我的功能多样化并使用异步等待...
(我在执行过程时遇到了类似的问题,并通过使用csvStream.pause()和csvStream.resume()解决了该问题)。
任何的想法 ?
最佳答案
嘿,在此之前,我先找到了解决方案,然后再寻求答案(对不起,稍后再发布)!
const launchProcedure = (name, file, callback) => {
try {
const fs = require("fs");
const stream = fs.createReadStream(file, {
encoding: 'utf8'
});
console.log('launching parsing...');
stream.once('readable', () => {
// ignore first line
let chunk;
while (null !== (chunk = stream.read(1))) {
if (chunk == '\n') {
break;
}
}
// CSV parsing
const csvStream = csv.fromStream(stream, {
renameHeaders: false,
headers: true,
delimiter: ',',
rowDelimiter: '\n',
quoteHeaders: false,
quoteColumns: false
}).on("data", data => {
console.log('procedure execution...');
// I execute a procedure...
}).on("error", error => {
logger.error(error);
}).on("end", data => {
logger.info(data);
callback();
});
});
}
catch (e) {
logger.info(e);
}
}
async.eachSeries(PROCEDURES, (procedure, callback) => {
launchProcedure(db, procedure.name, procedure.file, callback);
}, error => {
if (error) {
logger.error(error);
}
else {
logger.info("done");
}
});
关于javascript - 快速csv同步读取多个文件,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/51539461/