web-dev-qa-db-ja.com

ファイル全体をダウンロードせずにS3でCSVファイルを読み取って解析します

このモジュールをAWSLambda関数として実行する目的でnode.jsを使用します。

_aws-sdk_からs3.getObject()を使用すると、AmazonS3から非常に大きなCSVファイルを正常に取得できます。ファイル内の各行を読み取り、各行の本文でイベントを発行することを目的としています。

私が見つけたすべての例では、S3のCSVファイル全体をバッファリングまたはストリーミングし、文字列に変換してから、1行ずつ読み取る必要があるようです。

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

ソースCSVファイルのサイズを考えると、この操作には非常に長い時間がかかります。また、CSV行の長さはさまざまであり、オプションとしてバッファサイズを使用できるかどうかはわかりません。

質問

Node.jsでS3ファイルを取得し、それを1行ずつ読み取り/変換する方法はありますか?これにより、最初にメモリ内のファイル全体を文字列化する必要がなくなります。

理想的には、手動でループするのではなく、_fast-csv_および/または_node-csv_のより優れた機能を使用したいと思います。

8

createReadStream method を使用して、fast-csvにパイプできるはずです。

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

行ごとではありませんが、Rangeヘッダーを使用してバイト範囲ごとにS3オブジェクトを取得できます。したがって、たとえば一度に1000バイトを読み取り、データを読み取るときに自分の側で新しい行を管理することができます。 GETオブジェクトドキュメント を見て、Rangeヘッダーを検索します。

0
jzonthemtn