web-dev-qa-db-fra.com

Recommandations de la bibliothèque: NodeJs lisant le fichier csv

Avec nodejs, je souhaite analyser un fichier .csv de 10 000 enregistrements et effectuer des opérations sur chaque ligne. J'ai essayé d'utiliser http://www.adaltas.com/projects/node-csv . Je ne pouvais pas faire cette pause à chaque rangée. Cela ne fait que lire tous les 10000 enregistrements. J'ai besoin de faire ce qui suit 

  1. lire csv ligne par ligne
  2. effectuer des opérations fastidieuses sur chaque ligne
  3. aller à la ligne suivante

Quelqu'un peut-il s'il vous plaît suggérer des idées alternatives ici?

81
lonelymo

On dirait que vous devez utiliser une solution basée sur le flux. Il existait déjà de telles bibliothèques. Avant de vous réinventer, essayez cette bibliothèque, qui inclut également un support de validation. https://www.npmjs.org/package/fast-csv

65
Risto Novik

Ma solution actuelle utilise le module asynchrone pour exécuter en série: 

var fs = require('fs');
var parse = require('csv-parse');
var async = require('async');

var inputFile='myfile.csv';

var parser = parse({delimiter: ','}, function (err, data) {
  async.eachSeries(data, function (line, callback) {
    // do something with the line
    doSomething(line).then(function() {
      // when processing finishes invoke the callback to move to the next one
      callback();
    });
  })
});
fs.createReadStream(inputFile).pipe(parser);
45
prule

J'ai utilisé de cette façon: -

var fs = require('fs'); 
var parse = require('csv-parse');

var csvData=[];
fs.createReadStream(req.file.path)
    .pipe(parse({delimiter: ':'}))
    .on('data', function(csvrow) {
        console.log(csvrow);
        //do something with csvrow
        csvData.Push(csvrow);        
    })
    .on('end',function() {
      //do something wiht csvData
      console.log(csvData);
    });
40
vineet

Le projet node-csv que vous référencez est tout à fait suffisant pour transformer chaque ligne d’une grande partie des données CSV, à partir de la documentation à l’adresse: http://csv.adaltas.com/transform/ :

csv()
  .from('82,Preisner,Zbigniew\n94,Gainsbourg,Serge')
  .to(console.log)
  .transform(function(row, index, callback){
    process.nextTick(function(){
      callback(null, row.reverse());
    });
});

D'après mon expérience, je peux dire que c'est aussi une implémentation assez rapide, j'ai travaillé avec elle sur des ensembles de données avec près de 10 000 enregistrements et les temps de traitement étaient à un niveau raisonnable de plusieurs dizaines de millisecondes pour l'ensemble.

Proposition de la solution basée sur le flux de jurka: Nud-csv IS basée sur le flux et suit l'API de diffusion en continu de Node.js.

9
krwck

Pour suspendre la diffusion dans fast-csv , vous pouvez effectuer les opérations suivantes:

let csvstream = csv.fromPath(filePath, { headers: true })
    .on("data", function (row) {
        csvstream.pause();
        // do some heavy work
        // when done resume the stream
        csvstream.resume();
    })
    .on("end", function () {
        console.log("We are done!")
    })
    .on("error", function (error) {
        console.log(error)
    });
8
adnan kamili
  • Cette solution utilise csv-parser au lieu de csv-parse utilisée dans certains Des réponses ci-dessus. 
  • csv-parser est arrivé environ 2 ans après csv-parse
  • Les deux résolvent le même objectif, mais personnellement, j’ai trouvé csv-parser meilleur, car il est facile de gérer les en-têtes à travers celui-ci.

Installez d'abord le parseur csv:

npm install csv-parser

Supposons donc que vous avez un fichier csv comme ceci:

NAME, AGE
Lionel Messi, 31
Andres Iniesta, 34

Vous pouvez effectuer l'opération requise en tant que:

const fs = require('fs'); 
const csv = require('csv-parser');

fs.createReadStream(inputFilePath)
.pipe(csv())
.on('data', function(data){
    try {
        console.log("Name is: "+data.NAME);
        console.log("Age is: "+data.AGE);

        //perform the operation
    }
    catch(err) {
        //error handler
    }
})
.on('end',function(){
    //some final operation
});  

Pour en savoir plus se référer

6
Pransh Tiwari

Le module Fast-CSV npm peut lire les données ligne par ligne à partir d'un fichier csv.

Voici un exemple:

let csv= require('fast-csv');

var stream = fs.createReadStream("my.csv");

csv
 .fromStream(stream, {headers : true})
 .on("data", function(data){
     console.log('I am one line of data', data);
 })
 .on("end", function(){
     console.log("done");
 });

J'avais besoin d'un lecteur csv asynchrone et j'avais d'abord essayé la réponse de @Pransh Tiwari mais je ne pouvais pas la faire fonctionner avec await et util.promisify(). Finalement, je suis tombé sur node-csvtojson , qui fait à peu près la même chose que csv-parser, mais avec des promesses. Voici un exemple d'utilisation de csvtojson en action:

const csvToJson = require('csvtojson');

const processRecipients = async () => {
    const recipients = await csvToJson({
        trim:true
    }).fromFile('./recipients.csv');

    // Code executes after recipients are fully loaded.
    recipients.forEach((recipient) => {
        console.log(recipient.name, recipient.email);
    });
};
2
alexkb

Essayez le plugin npm ligne par ligne.

npm install line-by-line --save
2
nickast

c'est ma solution pour obtenir un fichier csv depuis une URL externe

const parse = require( 'csv-parse/lib/sync' );
const axios = require( 'axios' );
const readCSV = ( module.exports.readCSV = async ( path ) => {
try {
   const res = await axios( { url: path, method: 'GET', responseType: 'blob' } );
   let records = parse( res.data, {
      columns: true,
      skip_empty_lines: true
    } );

    return records;
 } catch ( e ) {
   console.log( 'err' );
 }

} );
readCSV('https://urltofilecsv');
1
Andrea Perdicchia

Solution de contournement pour effectuer cette tâche avec wait/async:

const csv = require('csvtojson')
const csvFilePath = 'data.csv'
const array = await csv().fromFile(csvFilePath);
0
HMagdy

Vous pouvez convertir csv au format json à l’aide du module csv-to-json et utiliser facilement le fichier json dans votre programme

0
Anuj Kumar
fs = require('fs');
fs.readFile('FILENAME WITH PATH','utf8', function(err,content){
if(err){
    console.log('error occured ' +JSON.stringify(err));
 }
 console.log('Fileconetent are ' + JSON.stringify(content));
})
0
swapnil