node.js: lee un archivo de texto en una matriz. (Cada línea es un elemento de la matriz).
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.
Sincrónico:
var fs = require('fs');
var array = fs.readFileSync('file.txt').toString().split("\n");
for(i in array) {
console.log(array[i]);
}
Asincrónico:
var fs = require('fs');
fs.readFile('file.txt', function(err, data) {
if(err) throw err;
var array = data.toString().split("\n");
for(i in array) {
console.log(array[i]);
}
});
Si puede colocar los datos finales en una matriz, ¿no podría también colocarlos en una cadena y dividirlos, como se ha sugerido? En cualquier caso, si desea procesar el archivo línea por línea, también puede intentar algo como esto:
var fs = require('fs');
function readLines(input, func) {
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
while (index > -1) {
var line = remaining.substring(0, index);
remaining = remaining.substring(index + 1);
func(line);
index = remaining.indexOf('\n');
}
});
input.on('end', function() {
if (remaining.length > 0) {
func(remaining);
}
});
}
function func(data) {
console.log('Line: ' + data);
}
var input = fs.createReadStream('lines.txt');
readLines(input, func);
EDITAR: (en respuesta al comentario de phopkins ) Creo que (al menos en versiones más nuevas) 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 de varios megabytes de "Todo el trabajo y nada de juego hace que Jack sea un chico aburrido"):
function readLines(input, func) {
var remaining = '';
input.on('data', function(data) {
remaining += data;
var index = remaining.indexOf('\n');
var last = 0;
while (index > -1) {
var line = remaining.substring(last, index);
last = index + 1;
func(line);
index = remaining.indexOf('\n', last);
}
remaining = remaining.substring(last);
});
input.on('end', function() {
if (remaining.length > 0) {
func(remaining);
}
});
}
Usando el módulo readline de Node.js.
var fs = require('fs');
var readline = require('readline');
var filename = process.argv[2];
readline.createInterface({
input: fs.createReadStream(filename),
terminal: false
}).on('line', function(line) {
console.log('Line: ' + line);
});
js:
var array = fs.readFileSync('file.txt', 'utf8').split('\n');
ts:
var array = fs.readFileSync('file.txt', 'utf8').toString().split('\n');