问题描述
我是 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]))
.on('end',() => console.log(states) // This works
console.log(states) // This doesn't
但是每当我在控制台登录时,.on('end') 块都会记录值。
setGeneric
我认为这是由于解析器异步工作造成的。我试图解决承诺并使用 async/await 方法,但我无法在全局范围内使用解析的内容。
希望能在这方面得到一些帮助。
解决方法
你是对的,解析器是异步工作的。因此,它开始解析并使用事件回调(在您的情况下为“数据”、“结束”)。但是你的解析器之后的代码会在解析器开始工作后立即执行。因此,您对解析数据的所有操作都应在“结束”事件回调中完成。
// 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);
});