W nodejs chcę przeanalizować plik .csv zawierający 10000 rekordów i wykonać pewne operacje na każdym wierszu. Próbowałem użyć http://www.adaltas.com/projects/node-csv . Nie mogłem zatrzymać tego w każdym rzędzie. To tylko czyta wszystkie 10000 rekordów. Muszę wykonać następujące czynności:
- czytaj csv linia po linii
- wykonać czasochłonną operację na każdej linii
- przejdź do następnej linii
Czy ktoś może tu zasugerować jakieś alternatywne pomysły?
Odpowiedzi:
Wygląda na to, że musisz użyć jakiegoś rozwiązania opartego na strumieniu, istniały już takie biblioteki, więc zanim wymyślisz siebie na nowo, wypróbuj tę bibliotekę, która obejmuje również obsługę walidacji. https://www.npmjs.org/package/fast-csv
źródło
Użyłem w ten sposób: -
źródło
parse
nie jest zdefiniowane. Czy jest coś, czego mi brakuje? Kiedy uruchamiam,npm install csv-parse
a następnie w moim kodzie dodajęvar parse = require("csv-parse");
, to działa. Jesteś pewien, że twój działa? Tak czy inaczej, uwielbiam to rozwiązanie (nawet jeśli muszę dołączyćcsv-parse
modułcsv-parse
moduł.Moje obecne rozwiązanie używa modułu asynchronicznego do wykonywania w serii:
źródło
csv-parser
zamiastcsv-parse
używanego w niektórych z powyższych odpowiedzi.csv-parser
pojawił się około 2 lata późniejcsv-parse
.csv-parser
lepsze, ponieważ dzięki temu łatwo jest obsługiwać nagłówki.Najpierw zainstaluj parser csv:
Więc załóżmy, że masz taki plik csv:
Możesz wykonać wymaganą operację jako:
Więcej informacji można znaleźć w sekcji
źródło
Aby wstrzymać przesyłanie strumieniowe w fast-csv , możesz wykonać następujące czynności:
źródło
Projekt node-csv, do którego się odwołujesz, jest całkowicie wystarczający do zadania przekształcenia każdego wiersza dużej części danych CSV z dokumentów pod adresem : http://csv.adaltas.com/transform/ :
Z własnego doświadczenia mogę powiedzieć, że jest to również dość szybka implementacja, pracowałem z nią na zestawach danych z blisko 10k rekordami, a czasy przetwarzania były na rozsądnym poziomie kilkudziesięciu milisekund dla całego zestawu.
W związku z sugestią rozwiązania opartego na strumieniu jurki : Node-csv IS oparty na strumieniu i zgodny z API przesyłania strumieniowego Node.js.
źródło
Plik fast-csv npm może czytać dane wiersz po wierszu z pliku csv.
Oto przykład:
źródło
fromStream()
a na stronie projektu brakuje przykładów i dokumentacji.Potrzebowałem asynchronicznego czytnika csv i początkowo próbowałem odpowiedzi @Pransh Tiwari, ale nie mogłem go uruchomić z
await
iutil.promisify()
. W końcu natknąłem się na node-csvtojson , który robi prawie to samo co csv-parser, ale z obietnicami. Oto przykład użycia csvtojson w akcji:źródło
Wypróbuj wtyczkę linia po linii npm.
źródło
to jest moje rozwiązanie, aby uzyskać plik CSV z zewnętrznego adresu URL
źródło
Obejście problemu wykonania tego zadania z await / async :
źródło
Ok, więc jest tu wiele odpowiedzi i nie sądzę, aby odpowiadały one na twoje pytanie, które moim zdaniem jest podobne do mojego.
Musisz wykonać operację, taką jak kontakt z bazą danych lub interfejsem API trzeciej części, która zajmie trochę czasu i jest asynchroniczna. Nie chcesz ładować całego dokumentu do pamięci, ponieważ jest zbyt duży lub z innego powodu, więc musisz czytać wiersz po wierszu, aby go przetworzyć.
Przeczytałem dokumenty fs i może wstrzymać czytanie, ale użycie wywołania .on ('data') sprawi, że większość z tych odpowiedzi będzie ciągła i spowoduje problem.
AKTUALIZACJA: Wiem więcej informacji o strumieniach niż kiedykolwiek chciałem
Najlepszym sposobem na to jest utworzenie strumienia z możliwością zapisu. Spowoduje to przesłanie danych csv do twojego zapisywalnego strumienia, którym możesz zarządzać wywołaniami asyncronus. Potok będzie zarządzał buforem z powrotem do czytnika, więc nie skończysz z dużym zużyciem pamięci
Prosta wersja
Wersja klasy
STARA METODA:
PROBLEM Z czytelnym
Zauważysz
reading
flagę. Zauważyłem, że z jakiegoś powodu tuż pod koniec pliku .on („czytelny”) jest wywoływany po raz drugi na małych i dużych plikach. Nie jestem pewien dlaczego, ale to blokuje to od drugiego procesu odczytującego te same elementy zamówienia.źródło
Używam tego prostego: https://www.npmjs.com/package/csv-parser
Bardzo prosty w użyciu:
źródło
Używałem,
csv-parse
ale w przypadku większych plików występowały problemy z wydajnością, jedną z lepszych bibliotek, które znalazłem, jest Papa Parse , dokumenty są dobre, dobre wsparcie, lekkie, bez zależności.zainstalować
papaparse
Stosowanie:
Uwaga
header: true
jest opcją w konfiguracji, zobacz dokumentację, aby uzyskać inne opcjeźródło
źródło
Możesz przekonwertować csv na format json za pomocą modułu csv-to-json, a następnie możesz łatwo użyć pliku json w swoim programie
źródło
npm zainstaluj csv
Przykładowy plik CSV Będziesz potrzebować pliku CSV do analizy, więc albo już go masz, albo możesz skopiować tekst poniżej i wkleić go do nowego pliku i nazwać ten plik "mycsv.csv"
Przykładowy odczyt kodu i analiza pliku CSV
Utwórz nowy plik i wstaw do niego następujący kod. Przeczytaj koniecznie, co dzieje się za kulisami.
Uruchom aplikację i sprawdź działanie Otwórz konsolę i wpisz następujące polecenie:
Aplikacja węzła 1 Aplikacja węzła W konsoli powinny pojawić się następujące dane wyjściowe:
1 [MYCSV {Fieldone: 'ABC', Fieldtwo: '123', Fieldthree: 'Fudge'}, 2 MYCSV {Fieldone: '532', Fieldtwo: 'CWE', Fieldthree: 'ICECREAM'}, 3 MYCSV {Fieldone: '8023', Fieldtwo: 'POOP', Fieldthree: 'DOGS'}, 4 MYCSV {Fieldone: '441', Fieldtwo: 'CHEESE', Fieldthree: 'CARMEL'}, 5 MYCSV {Fieldone: '221', Fieldtwo: 'ABC', Fieldthree: 'HOUSE'},] Teraz powinieneś otworzyć przeglądarkę internetową i przejść do swojego serwera. Powinieneś zobaczyć, jak wyprowadza dane w formacie JSON.
Zakończenie Korzystając z node.js i jego modułu CSV możemy szybko i łatwo odczytać i wykorzystać dane przechowywane na serwerze oraz udostępnić je klientowi na żądanie
źródło