Ich möchte eine sehr, sehr große Datei in ein JavaScript-Array in node.js lesen.
Also, wenn die Datei so ist:
first line
two
three
...
...
Ich hätte das Array:
['first line','two','three', ... , ... ]
Die Funktion würde folgendermaßen aussehen:
var array = load(filename);
Daher ist die Idee, alles als Zeichenfolge zu laden und dann zu teilen, nicht akzeptabel.
javascript
node.js
Chacko
quelle
quelle
Antworten:
Wenn Sie die endgültigen Daten in ein Array einpassen können, können Sie sie dann nicht auch in eine Zeichenfolge einfügen und aufteilen, wie vorgeschlagen wurde? Wenn Sie die Datei zeilenweise verarbeiten möchten, können Sie in jedem Fall auch Folgendes versuchen:
BEARBEITEN: (als Antwort auf einen Kommentar von phopkins ) Ich denke, dass (zumindest in neueren Versionen) Teilzeichenfolgen keine Daten kopieren, sondern ein spezielles SlicedString-Objekt erstellen (aus einem kurzen Blick auf den v8-Quellcode). In jedem Fall handelt es sich hier um eine Modifikation, die den erwähnten Teilstring vermeidet (getestet an einer Datei im Wert von mehreren Megabyte im Wert von "Alle Arbeit und kein Spiel machen Jack zu einem langweiligen Jungen"):
quelle
Synchron:
Asynchron:
quelle
Unter Verwendung des Node.js Readline- Modul .
quelle
\n
am Ende keine hat ! Siehe: stackoverflow.com/questions/18450197/…js:
ts:
quelle
TypeError: fs.readFileSync(...).split is not a function
Punkte ausgelöst werden, sollten Sie .toString () wievar array = fs.readFileSync('file.txt', 'utf8').toString().split('\n');
Verwenden Sie readline ( Dokumentation ). Hier ist ein Beispiel, in dem Sie eine CSS-Datei lesen, nach Symbolen analysieren und diese in json schreiben
quelle
file.lines
mit JFile-PaketPseudo
Vergiss vorher nicht:
quelle
Mit einem BufferedReader sollte die Funktion jedoch asynchron sein:
quelle
Ich möchte nur @finbarr großartige Antwort hinzufügen, eine kleine Korrektur im asynchronen Beispiel:
Asynchron:
@MadPhysicist, done () gibt den Async frei. Anruf.
quelle
Dies ist eine Variation der obigen Antwort von @mtomis.
Es entsteht ein Linienstrom. Es gibt "Daten" - und "End" -Ereignisse aus, sodass Sie das Ende des Streams verwalten können.
Verwenden Sie es als Wrapper:
quelle
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);
und zählen Sie dann, wie oft 'Ende' für jedesvar 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'); });
Ausgabe: Jede Zeile in der Textdatei wurde für jede Instanz einmal ausgelöst. so war "Ende".Ich hatte das gleiche Problem und habe es mit dem Modul Zeile für Zeile gelöst
https://www.npmjs.com/package/line-by-line
Zumindest für mich funktioniert es wie ein Zauber, sowohl im synchronen als auch im asynchronen Modus.
Außerdem kann das Problem mit nicht terminierenden Leitungen \ n mit der folgenden Option gelöst werden:
Synchrone Verarbeitung von Zeilen:
quelle
Die Verwendung von Node.js v8 oder höher verfügt über eine neue Funktion, die die normale Funktion in eine asynchrone Funktion umwandelt.
util.promisify
Es ist eine großartige Funktion. Hier ist das Beispiel für das Parsen von 10000 Zahlen aus der txt-Datei in ein Array, wobei Inversionen mithilfe der Zusammenführungssortierung für die Zahlen gezählt werden.
quelle
Um eine große Datei in ein Array einzulesen, können Sie Zeile für Zeile oder Block für Block lesen.
Zeile für Zeile beziehen Sie sich auf meine Antwort hier
Stück für Stück finden Sie in diesem Artikel
quelle