nodecsv解析返回值在调用时返回为未定义



这是我运行的代码

const fs = require('fs');
const csvParse = require('csv-parse');
function getValue() {
let results = [];
fs.createReadStream('./assets/myCSV.csv')
.pipe(csvParse({delimiter: 'n'}))
.on('data', (data) => results.push(data))
.on('error', (err => {
console.log(`csv-parse error from getValue: ${err}`);
}))
.on('end', () => {
console.log('finished!');
let csvLength = Object.keys(results).length;
// getting a random value within the csv
min = Math.ceil(0);
max = Math.floor(csvLength);
let randomNumber = Math.floor(Math.random() * (max - min + 1)) + min;
let randomCSVLine = results[randomNumber];
console.log(randomCSVLine);
return randomCSVLine;
});
}
console.log(`mine: ${getValue()}`);

以下是结果,我不知道为什么值没有显示出来。我认为这可能是一个异步问题,但不确定如何解决它,但结果是:

mine: undefined
finished!
[ '10' ]

我想您会在这里找到解决方案。

Node.js的CSV解析器承诺使用

从Node.js版本15开始,Stream API承诺了一个新的";流/承诺";单元

Stream Promises模块的一部分是已完成的功能。函数插入流中,并在其不再可读、可写或遇到错误或过早关闭事件时解析promise。

promise示例利用pipe和finished提供了一个方便的解决方案,可以从文件系统读取文件并将其输出管道传输到解析器。

此示例可用于命令节点samples/recipe.promies.js.

const parse = require('csv-parse');
const fs = require('fs');
const { finished } = require('stream/promises');

const processFile = async () => {
records = []
const parser = fs
.createReadStream(`${__dirname}/fs_read.csv`)
.pipe(parse({
// CSV options if any
}));
parser.on('readable', function(){
let record;
while (record = parser.read()) {
// Work with each record
records.push(record)
}
});
await finished(parser);
return records
}
(async () => {
const records = await processFile()
console.info(records);
})()

只需要对代码进行相同的更改,就可以获得所需的结果。

最新更新