【发布时间】:2017-12-20 01:56:10
【问题描述】:
我正在尝试使用 npm 包 csv-parser 来解析我的 csv 文件,但遇到了事件发生顺序的问题。
事件按此顺序发出
- 'headers':想要将有关 csv 的元数据插入数据库并返回一个 id 值
- 'data':想要将headers事件返回的id值用于所有数据事件
- '数据'
- '数据'
- ...
- 结束
显然节点的异步性质意味着我在“标题”中的缓慢数据库访问在第一个“数据”事件发出时尚未返回,因此我还没有 csv 的 ID。我能想到的唯一选择是将所有数据行缓存到某个临时变量中,然后在读取整个 csv 后推送所有内容。考虑到我可能有非常大的 csv 文件,这似乎是个坏主意?对解决此问题的更好方法有何建议?
编辑:添加了一些代码(伪代码,未经实际测试)
let headerList = null;
let dataArray = [];
fs.createReadStream(path)
.pipe(csv())
// Parse the headers into a comma delimminated string
.on('headers', function(headers) {
// some parsing logic and then assigned to variable
headerList = headers;
})
.on('data', function (data) {
// Some push of data into a variable
dataArray.push(data);
})
.on('end', function() {
// create the base upload object
const id = uploads.createUpload(filename, headerList, new Date());
// insert data
uploads.insertUploadData(id, dataArray);
})
【问题讨论】:
-
也许读第一行,只是为了获取元数据。进行数据库调用。当第一个数据库调用返回 id 时,然后执行完整的解析过程......然后你不必缓存任何东西。只需将第一行读两遍。
-
是的,这不是一个坏主意。没想到那样做。
标签: javascript node.js node.js-stream