Khi tôi đang học Node. Js Tôi luôn ngạc nhiên về mức độ dễ thực hiện của một số việc và mức độ khó thực hiện của những việc khác cũng như mức độ nghèo nàn của các ví dụ ngoài kia
Trường hợp cụ thể, tôi muốn đọc một số dữ liệu từ tệp CSV và sau đó gửi dữ liệu đó tới Elaticsearch để lập chỉ mục. Phần Elaticsearch mình đã tìm hiểu rồi, còn trong Node. js thật dễ dàng. Tôi cho rằng việc tìm một ví dụ về đọc tệp, tạo các đối tượng dựa trên các hàng, xử lý các đối tượng và thực hiện tất cả những điều đó trong các khối khoảng 1000 hàng là chuyện nhỏ. Loại công cụ này dễ dàng trong C# và có rất nhiều ví dụ. Không phải trường hợp là Node. js
Đây là hai cách để làm điều đó
Bạn có thể tải xuống tệp CSV có tất cả các vở kịch của Shakespeare, nhưng ví dụ bạn có thể tải xuống ở trên chỉ có 650 dòng đầu tiên từ tệp đó
Tôi muốn đọc tệp 100 hàng cùng một lúc, đặt các hàng vào các đối tượng rồi xử lý các hàng
phân tích cú pháp csv
Mô-đun đầu tiên tôi gặp là csv-parse
Chạy cái này từ bảng điều khiển -
npm install csv-parse
Tôi có một lớp Entry
đại diện cho một hàng từ tệp CSV. Hàm tạo của nó có sáu tham số đại diện cho từng cột trong tệp CSV
Trong ví dụ này, việc xử lý dữ liệu theo khối là không cần thiết, nhưng khi tôi xử lý toàn bộ tệp với hơn 130.000 hàng, việc chia khối trở nên quan trọng
1var fs = require['fs'];
2var parse = require['csv-parse'];
3
4
5function readCSV[] {
6 let entries = [];
7 let count = 0;
8
9 fs.createReadStream['shakespeare_plays_sample.csv']
10 .pipe[parse[{ delimiter: ';', from_line: 2 }]]
11 .on['data', function [row] {
12 count++;
13 entries.push[new Entry[row[0], row[1], row[2], row[3], row[4], row[5]]]
14
15 if [count % 100 == 0] {
16 processEntries[entries];
17 count = 0;
18 entries = []; // clear the array
19 }
20 }]
21 .on['end', function [] {
22 processEntries[entries];
23 }];
24}
25
26function processEntries[entries] {
27 console.log[entries[0].Id + " to " + entries[entries.length - 1].Id];
28}
29
30class Entry {
31 constructor[id, play, characterLineNumber, actSceneLine, character, line] {
32 this.Id = id;
33 this.Play = play;
34 this.CharacterLineNumber = characterLineNumber;
35 this.ActSceneLine = actSceneLine;
36 this.Character = character;
37 this.Line = line;
38 }
39}
40
41readCSV[];
Lưu ý cách tôi phải đảm bảo rằng mâm cặp cuối cùng cũng được xử lý trên dòng 22
Cách tiếp cận này có vẻ ổn, nhưng sau đó tôi tìm thấy mô-đun csvtojson
csvtojson
Mô-đun này làm cho những gì tôi đang cố gắng thực hiện dễ dàng hơn một chút bằng cách bỏ qua nhu cầu xây dựng rõ ràng một đối tượng với dữ liệu từ các hàng trong tệp
Đầu tiên cài đặt mô-đun -
npm install csvtojson
Đây là mã -
1const csv=require['csvtojson'];
2
3function readCSV[]{
4 let entries = [];
5 let count = 0;
6
7 csv[{delimiter:';'}]
8 .fromFile['./shakespeare_plays_sample.csv']
9 .then[[json]=>{
10 json.forEach[[row]=>
11 {
12 count++;
13 entries.push[row];
14 if[count % 100 == 0]{
15 processEntries[entries];
16 count = 0;
17 entries = []; // clear the array
18 }
19 }];
20 processEntries[entries];
21 }]
22 return entries;
23}
24
25function processEntries[entries]{
26 console.log[entries[0].Id + " to " + entries[entries.length - 1].Id];
27}
28
29readCSV[];
Một lần nữa lưu ý cách tôi xử lý các đoạn 100, và sau đó là đoạn cuối cùng trên dòng 20
Tất cả những điều này là nhằm mục đích lập chỉ mục tất cả các tác phẩm của Shakespeare trong Elaticsearch và tôi sẽ trình bày trong một bài đăng khác