我是js的新手,正在尝试使用node.js在后端解析CSV。
我有一个状态数组,我想在其中存储CSV列的数据。这是我使用fast-csv编写的一个非常简单的代码。但是每当我运行代码时,我都会得到一个空数组[]。我试着用papaparse做同样的事情,也得到了同样的结果。
const csv = require('fast-csv')
const file = fs.createReadStream('main.csv');
var states = []
file
.pipe(csv.parse({ headers: false }))
.on('data', row => states.push(row[2]))
console.log(states)但是每当我通过控制台登录,然后.on('end')阻塞,这些值就会被记录下来。
const csv = require('fast-csv')
const file = fs.createReadStream('main.csv');
var states = []
file
.pipe(csv.parse({ headers: false }))
.on('data', row => states.push(row[2]))
.on('end', () => console.log(states) // This works
console.log(states) // This doesn't我认为这是由于解析器异步工作造成的。我试图解析promises并使用async/await方法,但我不能在全局范围内使用解析的内容。
希望在这件事上能帮上忙。
发布于 2021-06-24 21:28:27
你说得对,解析器异步工作。因此,它开始解析并在事件上使用回调(在你的例子中是‘data’,'end‘)。但解析器之后的代码将在解析器开始工作后立即执行。所以你对解析数据的所有操作都应该在'end‘事件回调中完成。
// function to start parser
const startParsing = (res) => {
const csv = require('fast-csv')
const file = fs.createReadStream('main.csv');
// you may use const cos it's type won't be changed
const states = []
file
.pipe(csv.parse({ headers: false }))
.on('data', row => states.push(row[2]))
// execute function after parsing.
.on('end', () => outputData(states, res));
};
const outputData = (states, res) => {
// your next actions here
console.log(states);
// for example, res.send(states) or anything to complete server response if it's accessible
res.send(states);
};
// then, in any place you need use this startParsing function, for example
server.get('/parser', (req, res) => {
startParsing(res);
});
https://stackoverflow.com/questions/68116381
复制相似问题