Hướng dẫn read csv from s3 nodejs - đọc csv từ s3 nodejs

Sử dụng Node.js, với ý định chạy mô -đun này như một hàm AWS Lambda.

Sử dụng s3.getObject() từ aws-sdk, tôi có thể chọn thành công một tệp CSV rất lớn từ Amazon S3. Ý định là đọc từng dòng trong tệp và phát ra một sự kiện với phần thân của mỗi dòng.

Trong tất cả các ví dụ tôi có thể tìm thấy, có vẻ như toàn bộ tệp CSV trong S3 phải được đệm hoặc phát trực tuyến, chuyển đổi thành một chuỗi và sau đó đọc từng dòng.

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

Hoạt động này mất một thời gian rất dài, với kích thước của tệp CSV nguồn. Ngoài ra, các hàng CSV có độ dài khác nhau và tôi không chắc chắn nếu tôi có thể sử dụng kích thước bộ đệm làm tùy chọn.

Câu hỏi

Có cách nào để chọn tệp S3 trong Node.js và đọc/chuyển đổi nó từng dòng, điều này tránh chuỗi toàn bộ tệp trong bộ nhớ trước không?

Lý tưởng nhất, tôi thích sử dụng các khả năng tốt hơn của fast-csv và/hoặc node-csv, thay vì lặp bằng tay.

Trong dự án của tôi, tôi cần viết một số mã tải xuống tệp CSV từ S3 và chuyển đổi nó thành định dạng JSON. Tôi chỉ chia sẻ những gì tôi đã làm và tạo ra một số ghi chú ngắn gọn cho mỗi API.

Môi trường

  • Nút: 8.10.0
  • AWS-SDK: 2.211.1
  • CSVTOJSON: 2.0.8

Kiến thức giả định

  • Cách nhận/đặt thông tin xác thực AWS
  • Cách sử dụng và xác định các thông tin đăng nhập trong tệp .ENV
require('dotenv').config();
const AWS = require('aws-sdk');
const csv = require('csvtojson');
const S3 = new AWS.S3();const params = {
Bucket: 'bucket name',
Key: 'csv file name'
};
async function csvToJSON() { // get csv file and create stream
const stream = S3.getObject(params).createReadStream();
// convert csv file (stream) to JSON format data
const json = await csv().fromStream(stream);
console.log(json);
};
csvToJSON();

getObject (): Lấy các đối tượng từ S3Retrieve the objects from S3

https://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject-property

GetObject ().Pipe the objects from S3 to Node.js Stream object

CSV (). FromStream (ReadableStream): Chuyển đổi sang JSON từ CSV ReadableStream.Convert to JSON from CSV readableStream.

Sự kết luận

Trên thực tế, tôi không biết chính xác đối tượng luồng trong Node.js là gì. Nhiệm vụ đã cho tôi một cơ hội để suy nghĩ về nó sâu sắc hơn. Ngoài ra, đây là bài viết đầu tiên của tôi trên trung bình. Tôi sẽ chia sẻ những gì tôi nghĩ, đã làm và trải nghiệm. Tôi hy vọng bài viết của tôi sẽ giúp ai đó. Cảm ơn bạn.

Cách sử dụng AWS S3 Chọn và Node.js

Cách sử dụng AWS S3 Chọn

Ảnh của Arif Riyanto trên unplash

Hôm nay tôi sẽ nói về S3 Chọn, một tính năng có thể giúp bạn trực tiếp lọc CSV.

Một trường hợp sử dụng thú vị là khi bạn có một CSV lớn (~ 100MB) nhưng chỉ cần một vài hàng của nó, được lọc theo ngày hoặc theo một danh mục, và bạn cũng muốn có kết quả trong JSON. Quá trình sau đây có thể làm giảm việc sử dụng bộ nhớ bên trong hàm Lambda và tạo các giải pháp để lọc hoặc chuyển đổi không cần thiết.

Nghe có vẻ tốt, phải không? Hãy xem nào:

const { SelectObjectContentCommand, S3Client } = require('@aws-sdk/client-s3');const readFileCSV = async (Bucket, Key) => {
const params = {
Bucket,
Key,
ExpressionType: 'SQL',
Expression: 'SELECT * FROM s3object s WHERE s."category" = "myCategory"',
InputSerialization: {
CSV: {
FileHeaderInfo: 'Use',
FieldDelimiter: ';',
},
CompressionType: 'NONE',
},
OutputSerialization: {
JSON: {
RecordDelimiter: ',',
},
},
};

const command = new SelectObjectContentCommand(params);
const response = await client.send(command);
return response.Payload;
}

Chúng ta có thể sử dụng biểu thức SQL thông qua ExpressionTypeExpression để lọc các bản ghi từ tệp CSV. Chúng tôi có thể thêm thông tin về việc đọc CSV với

require('dotenv').config();
const AWS = require('aws-sdk');
const csv = require('csvtojson');
const S3 = new AWS.S3();const params = {
Bucket: 'bucket name',
Key: 'csv file name'
};
async function csvToJSON() { // get csv file and create stream
const stream = S3.getObject(params).createReadStream();
// convert csv file (stream) to JSON format data
const json = await csv().fromStream(stream);
console.log(json);
};
csvToJSON();
0 và về cách xuất bản ghi bằng
require('dotenv').config();
const AWS = require('aws-sdk');
const csv = require('csvtojson');
const S3 = new AWS.S3();const params = {
Bucket: 'bucket name',
Key: 'csv file name'
};
async function csvToJSON() { // get csv file and create stream
const stream = S3.getObject(params).createReadStream();
// convert csv file (stream) to JSON format data
const json = await csv().fromStream(stream);
console.log(json);
};
csvToJSON();
1.

Mỗi bản ghi trong đầu ra sẽ ở trong JSON nhưng sẽ không trả lại một mảng các đối tượng JSON, vì vậy chúng tôi cần thực hiện một mẹo nhỏ và biến đổi nó trong một đối tượng JavaScript. Vì vậy, như đã nêu trong các tệp đọc từ Amazon S3 bằng Node.js, chúng ta cần chuyển đổi các khối bộ đệm thành một chuỗi và sau đó phân tích cú pháp trong JSON.

const convertDataToJson = async (generator) => {
const chunks = [];
for await (const value of generator) {
if (value.Records) {
chunks.push(value.Records.Payload);
}
}
let payload = Buffer.concat(chunks).toString('utf8');
payload = payload.replace(/,$/, '');
return JSON.parse(`[${payload}]`);
};

Bây giờ chúng tôi có một CSV được lọc và chuyển đổi mà không cần sử dụng bất kỳ thư viện nào và chúng tôi có thể tăng hiệu suất của chức năng Lambda.

Hẹn sớm gặp lại!

Làm cách nào để đọc tệp CSV trong Node JS?

Bạn sẽ sử dụng phương thức CreateReadstream () của mô -đun FS để đọc dữ liệu từ tệp CSV và tạo luồng có thể đọc được. Sau đó, bạn sẽ gửi luồng vào một luồng khác được khởi tạo với mô-đun CSV-Parse để phân tích các khối dữ liệu. Khi các khối dữ liệu đã được phân tích cú pháp, bạn có thể ghi lại chúng vào bảng điều khiển.use the fs module's createReadStream() method to read the data from the CSV file and create a readable stream. You will then pipe the stream to another stream initialized with the csv-parse module to parse the chunks of data. Once the chunks of data have been parsed, you can log them in the console.

Làm cách nào để đọc tệp CSV từ thùng S3 trong AWS Lambda?

Hàm Lambda để đọc tệp CSV từ thùng S3 và đẩy vào bảng DynamoDB..
Bảng điều khiển Goto Lambda và nhấp vào Chức năng Tạo ..
Chọn "Tác giả từ đầu", tên hàm = CSV_S3_LAMBDA, RUNTIME = PYTHON và vai trò chúng tôi đã tạo với chính sách trên được đính kèm vào blog này và nhấp vào chức năng Tạo ..

Làm cách nào để bạn đọc tệp CSV và tải vào DynamoDB bằng chức năng Lambda?

Chi tiết nhiệm vụ..
Đăng nhập vào Bảng điều khiển quản lý AWS ..
Tạo bảng Amazon DynamoDB ..
Tạo một thùng S3 và tải lên tệp CSV ..
Tạo chức năng Lambda ..
Kiểm tra nhập dữ liệu CSV bằng cách sử dụng thử nghiệm giả trong Lambda ..
Thêm kích hoạt sự kiện vào thùng S3 ..
Kiểm tra kích hoạt sự kiện S3 để nhập dữ liệu vào DynamoDB ..
Xác nhận phòng thí nghiệm ..

Làm thế nào để bạn viết dữ liệu trong tệp CSV bằng Node JS?

Đầu tiên, chúng tôi nhập mô-đun hệ thống tệp gốc (FS) và mô-đun phân chia CSV.Sau đó, chúng tôi tạo một trình phân tích cú pháp chấp nhận một đối tượng theo nghĩa đen, chứa các tùy chọn chúng tôi muốn đặt.Đối số thứ hai là chức năng gọi lại được sử dụng để truy cập các bản ghi - hoặc chỉ in chúng ra, trong trường hợp của chúng tôi.