2016-10-04 74 views
3

使用node.js,目的是将此模块作为AWS Lambda函数运行。在S3中读取和解析CSV文件而无需下载整个文件

使用s3.getObject()aws-sdk,我能够成功从亚马逊S3获取一个非常大的CSV文件。目的是读取文件中的每一行,并用每行的主体发出一个事件。

在我能找到的所有示例中,它看起来像S3中的整个CSV文件必须被缓冲或流式传输,转换为字符串,然后逐行读取。

s3.getObject(params, function(err, data) { 
    var body = data.Body.toString('utf-8'); 
} 

由于源CSV文件的大小,此操作需要很长时间。另外,CSV行的长度也不相同,我不确定是否可以使用缓冲区大小作为选项。

问题

有没有办法来拿起node.js中的S3文件和读/逐行改造它,从而避免了第一字符串化整个文件在内存中?

理想情况下,我宁愿使用fast-csv和/或node-csv的更好功能,而不是手动循环。

回答

7

你应该只能够使用createReadStream method和管道将它导入快速CSV:

const s3Stream = s3.getObject(params).createReadStream() 
require('fast-csv').fromStream(s3Stream) 
    .on('data', (data) => { 
    // do something here 
    }) 
+0

工程魅力。流赢了! – changingrainbows

0

由行不行,但你可以使用Range头球攻门被字节范围得到S3对象。因此,您可以一次读取1000字节,并在读取数据时管理您的最后一行。查看GET Object documentation并搜索范围标题。