Nodejs read file

Chào anh em hiện mình có 1 file csv khoản 100k dòng, nếu gọi api để đọc 1 lần thì có thể bị lỗi vì quá nhiều data, vậy có cách nào để mình đọc và xử lý ví dụ 1 lần chạy khoản 10 dòng thôi , anh em nào có cách hay keyword nào để giải quyết vấn đề này không ạ
xin cám ơn anh em

trước khi suy nghĩ đến cách giải quyết, cần phải tìm hiểu vấn đề, ít nhất là bạn cũng nên mô tả rõ ràng vấn đề

bạn upload file 100k dòng lên, và mong đợi kết quả gì? “đọc” và làm gì và trả về cái gì? insert vô db 100k dòng?
lỗi là lỗi gì? thời gian server đọc quá lâu nên timeout? timeout database hay timeout server response hay timeout network? insert quá nhiều làm tạch luôn db??

5 Likes

à nghĩa là mình có 1 file trên server sau đó mình có cron sẽ gọi lên server lấy file đó về và lưu từ rows vào data vào DB, nhưng nhiều rows quá có thể dẫn tới timeout , mình cần là ví dụ 1 file csv đó mình sẽ đọc tuần tự 10 row sẽ lưu vào 1 lần ấy cứ như thế cho đến hết 100k rows đó ak

4 đoạn này đều chưa có gì rõ ràng

  1. server ở đoạn 1 và server ở đoạn 2 là cùng một server hay là khác nhau? chắc là khác, coi như câu này cũng đoán được, bạn confirm lại vấn đề này
  2. cron này chạy ở đâu? (chắc là server 2) lấy file đó (ở server 1) như thế nào (giao thức nào)? (s)ftp/ssh/http? cron này chạy shell hay ứng dụng gì (node/python…)? dùng gì để xử lý?
    bạn có kiểm trả thời gian lấy là bao lâu chưa? giao tiếp network là mạng LAN hay internet?
  3. database đặt ở đâu? server 1 hay 2 hay là một server bên thứ 3?
  4. timeout mà bạn nói là timeout của ứng dụng hay của cái gì? vì mình không thấy vai trò của client ui ở đây, vậy thì làm sao biết timeout
  5. file này dung lượng bao nhiêu? insert vào thuần 1 bảng hay nhiều bảng? có validate trước hay không? fail thì có cần rollback?
  6. Bạn dùng cron thì có vẻ như nó là việc gì đó định kì, vậy bao lâu một lần, trong thời gian xử lý đó thì mong đợi kết quả là gì? file đó từ đâu mà ra (nằm trên server)?

nếu thật sự phải làm (lấy file, đọc và insert db) thì việc này có thể chỉ cần dùng bash/shell, không cần đụng đến node
download -> wget/curl
import -> có thể tiền xử lý file nầy thành các query và dùng cli tool của db để import,

bạn cũng chưa nói rõ là bạn dùng db gì, các server chạy os gì, file csv có thể sửa format hay không (là hệ thông khác của bên bạn export ra hay do đối tác quy định…)
việc bạn không cung cấp rõ ràng thì giải pháp gợi ý cũng không chắc chắn được

tóm lại là nếu muốn moi móc sẽ có rất nhiều vấn đề xoay quanh cái mà bạn đang muốn làm
bạn có thể nói về business không, lý do của cái task import 100k dòng này là gì

6 Likes

à do cái này cũng mới nên mình cũng chưa biết giải thích sao cho hợp lý nữa, dễ hiểu là mình có 1 file trong đó có khoản 100k dòng, và mình đang dùng Nodejs và mình muốn nó đọc cái file đó mỗi lần lấy 10 dòng để xử lý cứ như thế cho đến hết 100k dòng đó ak

Vấn đề này giống y như bài tập về nhà của mình, đề là cho 1 file nhị phân (trường hợp này là CSV) hãy xuất tuần tự nội dụng file ra màn hình console Đáp án bằng java là dùng 1 vòng while kết hợp với vài lệnh stream là ra (đọc tuần tự mảng bytes) các ngôn ngữ khác mình nghĩ chắc tương tự.

2 Likes

Node.js cũng có Stream :kissing:

4 Likes

có anh em nào làm chưa ạ cho mình xin thông tin với

Cách đơn giản nhất là dùng stream. Bạn đọc bài này chắc sẽ hiểu:
https://www.tutorialspoint.com/nodejs/nodejs_streams.htm

Còn trên thực tế thì mình nghĩ chuyển hết đống dữ liệu đó vào DB là tốt nhất. Timeout hay gì đó là do tối ưu chưa tốt

4 Likes

File CSV thì liên quan gì đến API? Giờ cứ hở ra là API chẳng thể hiểu được. API của hệ điều hành cũng có không xài, toàn xài API web services để xử lý mấy tác vụ khủng không có bản chất web làm gì nhỉ?

Mình đánh giá đây là câu hỏi Fake. Không phải là đọc file CSV với nodejs gì cả mà là không biết dùng Google và nắm Nodejs còn sơ khai quá mà đã muốn làm việc lớn, hoặc muốn… mì ăn liền?

Không nói dóc, mình chẳng biết gì về NodeJS nhưng vì tức cái chủ đề fake này nên Google thấy được bài trên StackOverflow, theo chỉ dẫn ở đó đã đọc được một file 2GB (cat > blah.txt blu.txt… tùm lum file .txt có trên máy mình) mà không vấn đề gì. Không timeout gì hết vì mình đọc một lần 500 dòng, chỉ tốn có vài MB bộ nhớ, chèn vào DB xong rồi lại quay lại đọc tiếp, lần lượt cho đến hết, lúc này chỉ là máy yếu hay mạnh mà nhanh hay chậm thôi, chưa bàn đến mấy cái tối ưu này nọ.

Giả sử trường hợp Nodejs (thực ra là JavaScript/ TypeScript chứ Nodejs chả phải ngôn ngữ lập trình) không mạnh về xử lý file trực tiếp, nó vẫn có thể gọi một cái gì đó ngay trên server làm thay, thậm chí gọi lệnh từ DB để import file CSV đó vào mà không cần 10 dòng một lúc làm gì.

Giờ chủ topic nên hỏi Google: nodejs read CSV large file.

5 Likes

100k dòng không lớn đâu, read 1 lần và insert 1 lần là đủ rồi. Nếu máy yếu quá thì đọc theo chunk, một lần 10k hoặc 5k gì đó.

Mình nghĩ bạn chưa từng phân tích data trên csv nên mới hỏi vậy.

6 Likes
83% thành viên diễn đàn không hỏi bài tập, còn bạn thì sao?