Me gustaría leer un archivo muy, muy grande en una matriz de JavaScript en node.js.
Entonces, si el archivo es así:
first line
two
three
...
...
Tendría la matriz:
['first line','two','three', ... , ... ]
La función se vería así:
var array = load(filename);
Por lo tanto, la idea de cargarlo todo como una cadena y luego dividirlo no es aceptable.
javascript
node.js
chacko
fuente
fuente
Respuestas:
Si puede ajustar los datos finales en una matriz, ¿no podría también ajustarlos en una cadena y dividirlos, como se ha sugerido? En cualquier caso, si desea procesar el archivo una línea a la vez, también puede intentar algo como esto:
EDITAR: (en respuesta al comentario de phopkins ) Creo que (al menos en versiones más recientes) la subcadena no copia datos, sino que crea un objeto SlicedString especial (de un vistazo rápido al código fuente v8). En cualquier caso, aquí hay una modificación que evita la subcadena mencionada (probada en un archivo por varios megabytes de "Todo el trabajo y nada de juego convierte a Jack en un niño aburrido"):
fuente
Sincrónico:
Asincrónico:
fuente
Utilizando el Node.js módulo readline .
fuente
\n
al final. Ver: stackoverflow.com/questions/18450197/…js:
ts:
fuente
TypeError: fs.readFileSync(...).split is not a function
, debe usar .toString () así:var array = fs.readFileSync('file.txt', 'utf8').toString().split('\n');
use readline ( documentación ). Aquí hay un ejemplo leyendo un archivo CSS, analizando íconos y escribiéndolos en json
fuente
file.lines
con paquete JFileSeudo
No olvides antes:
fuente
Con un BufferedReader , pero la función debe ser asíncrona:
fuente
Solo quiero agregar una excelente respuesta a @finbarr, una pequeña solución en el ejemplo asincrónico:
Asincrónico:
@MadPhysicist, done () es lo que libera el asíncrono. llamada.
fuente
Esta es una variación de la respuesta anterior de @mtomis.
Crea una corriente de líneas. Emite eventos de 'datos' y 'fin', lo que le permite manejar el final de la transmisión.
Úselo como envoltorio:
fuente
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);
luego cuente cuántas veces se dispara 'final' para cada unovar 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'); });
salida: cada línea en el archivo de texto se disparó una vez para cada instancia. así fue 'fin'.Tuve el mismo problema y lo resolví con el módulo línea por línea
https://www.npmjs.com/package/line-by-line
Al menos para mí funciona de maravilla, tanto en modo síncrono como asíncrono.
Además, el problema con las líneas que terminan sin terminar \ n se puede resolver con la opción:
Procesamiento síncrono de líneas:
fuente
Usar Node.js v8 o posterior tiene una nueva característica que convierte la función normal en una función asíncrona.
util.promisify
Es una característica asombrosa. Este es el ejemplo de analizar 10000 números del archivo txt en una matriz, contando las inversiones mediante la combinación de clasificación en los números.
fuente
Para leer un archivo grande en una matriz, puede leer línea por línea o fragmento por fragmento.
línea por línea consulte mi respuesta aquí
trozo a trozo consulte este artículo
fuente