node.js: lee un archivo de texto en una matriz. (Cada línea es un elemento de la matriz).

Resuelto chacko asked hace 13 años • 15 respuestas

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.

chacko avatar Jul 26 '11 21:07 chacko
Aceptado

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]);
    }
});
Finbarr avatar Jul 26 '2011 14:07 Finbarr

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);
    }
  });
}
mtomis avatar Jul 26 '2011 16:07 mtomis

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);
});
zswang avatar Sep 06 '2012 11:09 zswang

js:

var array = fs.readFileSync('file.txt', 'utf8').split('\n');

ts:

var array = fs.readFileSync('file.txt', 'utf8').toString().split('\n');
hojin avatar Sep 17 '2019 07:09 hojin