gpt4 book ai didi

node.js - 帕帕帕斯和高地

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:53 25 4
gpt4 key购买 nike

我必须在 NodeJS 中解析一个非常大的 CSV 文件并将其保存在一次最多允许 500 个条目的数据库中(异步操作)。由于内存限制,我必须流式传输 CSV 文件,并希望使用 PapaParse 来解析 CSV 文件(因为这在我的情况下效果最好)。

由于 PapaParse 使用回调风格的方法来解析 Node.js 流,我没有看到一个容易将高地(用于批处理和数据转换)和 PapaParse 结合起来的方法。因此,我尝试使用 ParseThrough 流将数据写入并使用 highland 读取该流以进行批处理:

const csv = require('papaparse');
const fs = require('fs');
const highland = require('highland');
const { PassThrough } = require('stream');

const passThroughStream = new PassThrough({ objectMode: true });

csv.parse(fileStream, {
step: function(row) {
// Write data to stream
passThroughStream.write(row.data[0]);
},
complete: function() {
// Somehow "end" the stream
passThroughStream.write(null);
},
});

highland(passThroughStream)
.map((data) => {
// data transform
})
.batch(500)
.map((data) => {
// Save up to 500 entries in database (async call)
});

显然这不能按原样工作,也没有真正做任何事情。类似的事情是否可能甚至是更好的方法来解析非常大的 CSV 文件并将行保存在数据库中(批量最多 500 个)?

编辑:使用 csv 包( https://www.npmjs.com/package/csv )可以像这样(fast-csv 相同):

highland(fileStream.pipe(csv.parse()))
.map((data) => {
// data transform
})
.batch(500)
.map((data) => {
// Save up to 500 entries in database (async call)
});

但不幸的是,两个 NPM 包在所有情况下都无法正确解析 CSV 文件。

最佳答案

快速浏览一下 papaparse 后,我决定在 scramjet 中实现 CSV 解析器。

fileStream.pipe(new scramjet.StringStream('utf-8'))
.csvParse(options)
.batch(500)
.map(items => db.insertArray('some_table', items))

我希望这对你有用。 :)

关于node.js - 帕帕帕斯和高地,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48632646/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com