将 CSV 中的数据保存在全局变量中 (fast-csv/papaparse)

问题描述

我是 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);
});

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...