cha*_*ows 6 amazon-s3 amazon-web-services node.js aws-sdk
使用node.js,目的是将此模块作为AWS Lambda函数运行.
使用s3.getObject()from aws-sdk,我能够从Amazon S3成功获取一个非常大的CSV文件.目的是读取文件中的每一行,并用每行的主体发出一个事件.
在我可以找到的所有示例中,看起来S3中的整个CSV文件必须被缓冲或流式传输,转换为字符串然后逐行读取.
s3.getObject(params, function(err, data) {
var body = data.Body.toString('utf-8');
}
Run Code Online (Sandbox Code Playgroud)
考虑到源CSV文件的大小,此操作需要很长时间.此外,CSV行的长度各不相同,我不确定是否可以使用缓冲区大小作为选项.
题
有没有办法在node.js中获取S3文件并逐行读取/转换它,这样可以避免首先将整个文件串行化在内存中?
理想情况下,我更喜欢使用fast-csv和/或更好的功能node-csv,而不是手动循环.
idb*_*old 15
您应该只能使用该createReadStream方法并将其传递到fast-csv:
const s3Stream = s3.getObject(params).createReadStream()
require('fast-csv').fromStream(s3Stream)
.on('data', (data) => {
// do something here
})
Run Code Online (Sandbox Code Playgroud)
我没有足够的声誉来发表评论,但截至目前,“fast-csv”不存在接受的答案方法“fromStream”。现在你需要使用parseStream方法:
const s3Stream = s3.getObject(params).createReadStream()
require('fast-csv').parseStream(s3Stream)
.on('data', (data) => {
// use rows
})
Run Code Online (Sandbox Code Playgroud)
对我来说,解决我的问题的答案是,
const csv = require('@fast-csv/parse');
const params = {
Bucket: srcBucket,
Key: srcKey,
};
const csvFile = s3.getObject(params).createReadStream();
let parserFcn = new Promise((resolve, reject) => {
const parser = csv
.parseStream(csvFile, { headers: true })
.on("data", function (data) {
console.log('Data parsed: ', data);
})
.on("end", function () {
resolve("csv parse process finished");
})
.on("error", function () {
reject("csv parse process failed");
});
});
try {
await parserFcn;
} catch (error) {
console.log("Get Error: ", error);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
8444 次 |
| 最近记录: |