Chciałbym wczytać bardzo, bardzo duży plik do tablicy JavaScript w node.js.
Więc jeśli plik wygląda tak:
first line
two
three
...
...
Miałbym tablicę:
['first line','two','three', ... , ... ]
Funkcja wyglądałaby tak:
var array = load(filename);
Dlatego pomysł załadowania tego wszystkiego jako łańcucha, a następnie podzielenia go, jest nie do przyjęcia.
javascript
node.js
chacko
źródło
źródło
Odpowiedzi:
Jeśli możesz dopasować ostateczne dane do tablicy, to czy nie byłbyś również w stanie dopasować go do ciągu i podzielić go, jak zasugerowano? W każdym razie, jeśli chcesz przetwarzać plik po jednej linii na raz, możesz również spróbować czegoś takiego:
EDYCJA: (w odpowiedzi na komentarz phopkinsa ) Myślę (przynajmniej w nowszych wersjach) podciąg nie kopiuje danych, ale tworzy specjalny obiekt SlicedString (z szybkiego spojrzenia na kod źródłowy v8). W każdym razie tutaj jest modyfikacja, która unika wspomnianego podciągu (przetestowano na pliku o wartości kilku megabajtów „Cała praca i brak zabawy sprawia, że Jack jest nudnym chłopcem”):
źródło
Synchroniczny:
Asynchroniczny:
źródło
Korzystanie z node.js moduł readline .
źródło
\n
na końcu! Zobacz: stackoverflow.com/questions/18450197/…js:
ts:
źródło
TypeError: fs.readFileSync(...).split is not a function
, powinieneś użyć .toString () w ten sposób:var array = fs.readFileSync('file.txt', 'utf8').toString().split('\n');
użyj readline ( dokumentacja ). oto przykład czytania pliku css, analizowania ikon i zapisywania ich w json
źródło
file.lines
z pakietem JFileRzekomy
Nie zapomnij wcześniej:
źródło
Z BufferedReader , ale funkcja powinna być asynchroniczna:
źródło
chcę tylko dodać @finbarr świetną odpowiedź, małą poprawkę w asynchronicznym przykładzie:
Asynchroniczny:
@MadPhysicist, done () jest tym, co zwalnia async. połączenie.
źródło
To jest wariacja na temat powyższej odpowiedzi autorstwa @mtomis.
Tworzy strumień linii. Emituje zdarzenia „data” i „end”, co pozwala obsłużyć koniec strumienia.
Użyj go jako opakowania:
źródło
var EventEmitter = require('events').EventEmitter; var util = require('util'); function GoodEmitter() { EventEmitter.call(this); } util.inherits(GoodEmitter, EventEmitter);
var li1 = new LineStream(input1), li2 = new LineStream(input2);
a następnie policz, ile razy 'koniec' jest uruchamiany dla każdego z nichvar fs = require('fs'); var input1 = fs.createReadStream('text.txt'); var ls1 = new LineStream(input1); ls1.on('data', function (line) { console.log('1:line=' + line); }); ls1.on('end', function (line) { console.log('1:fin'); }); var input2 = fs.createReadStream('text.txt'); var ls2 = new LineStream(input2); ls2.on('data', function (line) { console.log('2:line=' + line); }); ls2.on('end', function (line) { console.log('2:fin'); });
dane wyjściowe: każda linia w pliku tekstowym została uruchomiona raz dla każdej instancji. więc był „koniec”.Miałem ten sam problem i rozwiązałem go z modułem linia po linii
https://www.npmjs.com/package/line-by-line
Przynajmniej dla mnie działa jak urok, zarówno w trybie synchronicznym, jak i asynchronicznym.
Również problem z liniami kończącymi się, ale nie kończącymi się \ n można rozwiązać za pomocą opcji:
Synchroniczna obróbka linii:
źródło
Korzystanie z Node.js w wersji 8 lub nowszej ma nową funkcję, która konwertuje normalną funkcję na funkcję asynchroniczną.
util.promisify
To niesamowita funkcja. Oto przykład parsowania 10000 liczb z pliku txt do tablicy, zliczając inwersje przy użyciu sortowania scalającego na liczbach.
źródło
Aby wczytać duży plik do tablicy, możesz czytać wiersz po wierszu lub fragment po kawałku.
wiersz po wierszu zapoznaj się z moją odpowiedzią tutaj
fragment po kawałku odnoszą się do tego artykułu
źródło