Question Lire un fichier une ligne à la fois dans node.js?


J'essaie de lire un gros fichier une ligne à la fois. j'ai trouvé une question sur Quora qui traitait du sujet, mais il me manque des liens pour que tout se corresponde.

 var Lazy=require("lazy");
 new Lazy(process.stdin)
     .lines
     .forEach(
          function(line) { 
              console.log(line.toString()); 
          }
 );
 process.stdin.resume();

Le bit que je voudrais comprendre est la manière dont je pourrais lire une ligne à la fois à partir d’un fichier au lieu de STDIN comme dans cet exemple.

J'ai essayé:

 fs.open('./VeryBigFile.csv', 'r', '0666', Process);

 function Process(err, fd) {
    if (err) throw err;
    // DO lazy read 
 }

mais ça ne marche pas. Je sais que dans un pincement je pourrais me rabattre sur l’utilisation de quelque chose comme PHP, mais je voudrais comprendre cela.

Je ne pense pas que l'autre solution fonctionnerait car le fichier est beaucoup plus volumineux que le serveur pour lequel je l'utilise.


414
2018-05-27 18:49


origine


Réponses:


Depuis Node.js v0.12 et à partir de Node.js v4.0.0, il existe une version stable readline module de base. Voici le moyen le plus simple de lire les lignes d'un fichier, sans aucun module externe:

var lineReader = require('readline').createInterface({
  input: require('fs').createReadStream('file.in')
});

lineReader.on('line', function (line) {
  console.log('Line from file:', line);
});

La dernière ligne est lue correctement (à partir de la version v0.12 ou ultérieure), même s'il n'y a pas de final \n.

METTRE À JOUR: cet exemple a été ajouté à la documentation officielle de l'API de Node.


533
2017-09-16 02:59



Pour une opération aussi simple, il ne devrait y avoir aucune dépendance à l'égard des modules tiers. Allez-y doucement

var fs = require('fs'),
    readline = require('readline');

var rd = readline.createInterface({
    input: fs.createReadStream('/path/to/file'),
    output: process.stdout,
    console: false
});

rd.on('line', function(line) {
    console.log(line);
});

145
2018-03-21 17:48



Vous n'êtes pas obligé de open le fichier, mais au lieu de cela, vous devez créer un ReadStream.

fs.createReadStream

Puis passez ce flux à Lazy


60
2018-05-27 19:10



il y a un très bon module pour lire un fichier ligne par ligne, ça s'appelle lecteur de ligne

avec cela, vous écrivez simplement:

var lineReader = require('line-reader');

lineReader.eachLine('file.txt', function(line, last) {
  console.log(line);
  // do whatever you want with line...
  if(last){
    // or check if it's the last one
  }
});

vous pouvez même réitérer le fichier avec une interface "java-style", si vous avez besoin de plus de contrôle:

lineReader.open('file.txt', function(reader) {
  if (reader.hasNextLine()) {
    reader.nextLine(function(line) {
      console.log(line);
    });
  }
});

29
2018-04-13 15:39



Ancien sujet, mais cela fonctionne:

var rl = readline.createInterface({
      input : fs.createReadStream('/path/file.txt'),
      output: process.stdout,
      terminal: false
})
rl.on('line',function(line){
     console.log(line) //or parse line
})

Simple. Pas besoin de module externe.


18
2018-04-09 23:48



Vous pouvez toujours lancer votre propre lecteur de ligne. Je n'ai pas encore évalué cet extrait, mais il scinde correctement le flux entrant de morceaux en lignes sans le \ n 'final

var last = "";

process.stdin.on('data', function(chunk) {
    var lines, i;

    lines = (last+chunk).split("\n");
    for(i = 0; i < lines.length - 1; i++) {
        console.log("line: " + lines[i]);
    }
    last = lines[i];
});

process.stdin.on('end', function() {
    console.log("line: " + last);
});

process.stdin.resume();

J'ai trouvé cela en travaillant sur un script d'analyse rapide du journal qui devait accumuler des données pendant l'analyse du journal et j'ai pensé qu'il serait bien d'essayer de le faire en utilisant js et node au lieu d'utiliser perl ou bash.

Quoi qu'il en soit, je pense que les petits scripts nodejs devraient être autonomes et ne pas reposer sur des modules tiers, après avoir lu toutes les réponses à cette question, en utilisant différents modules pour gérer l'analyse des lignes.


15
2017-08-28 08:43



Avec le module de transport:

var carrier = require('carrier');

process.stdin.resume();
carrier.carry(process.stdin, function(line) {
    console.log('got one line: ' + line);
});

12
2017-08-24 10:10



require('fs').readFileSync('file.txt').toString().split(/\r?\n/).forEach(function(line){
  console.log(line);
})

11
2018-06-27 00:13