NodeJs lecture du fichier csv

Avec nodejs je veux analyser un .fichier csv de 10000 enregistrements et faire une opération sur chaque ligne. J'ai essayé d'utiliser http://www.adaltas.com/projects/node-csv . Je ne pouvais pas faire une pause à chaque ligne. Cela lit juste à travers tous les 10000 enregistrements. Je dois faire ce qui suit

1) lire csv ligne par ligne 2) effectuer une opération fastidieuse sur chaque ligne 3) aller à la ligne suivante

Quelqu'un peut-il suggérer des idées alternatives ici?

71
demandé sur lonelymo 2014-04-15 13:58:47

10 réponses

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

50
répondu Risto Novik 2014-04-15 13:58:51

Ma solution actuelle utilise le module asynchrone pour s'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);
41
répondu prule 2017-07-27 08:00:44

J'ai utilisé 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);
    });
34
répondu vineet 2016-05-19 05:01:55

Le projet node-csv que vous référencez est tout à fait suffisant pour la tâche de transformer chaque ligne d'une grande partie des données CSV, à partir des documents à: 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 plutôt rapide, j'ai travaillé avec elle sur des ensembles de données avec près de 10K enregistrements et les temps de traitement étaient à un niveau raisonnable de dizaines de millisecondes pour l'ensemble.

Rearding jourka's suggestion de solution basée sur un flux: node-csv est basé sur un flux et suit le nœud.js streaming API.

9
répondu krwck 2015-03-07 19:16:41

Afin de mettre en pause le streaming dans Fast-csv vous pouvez faire ce qui suit:

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)
    });
5
répondu adnan kamili 2017-04-18 07:49:51

Essayez le plugin npm ligne par ligne.

npm install line-by-line --save
4
répondu nickast 2015-09-18 13:51:05
  • Cette solution utilise csv-parser au lieu de csv-parse utilisé dans certains les réponses ci-dessus.
  • csv-parser est venu environ 2 ans après csv-parse.
  • les deux résolvent le même but, mais personnellement j'ai trouvé csv-parser mieux, car il est facile de gérer les en-têtes à travers elle.

Installez d'abord l'analyseur csv:

npm install csv-parser

Supposons donc que vous ayez un fichier csv comme ceci:

NAME, AGE
Lionel Messi, 31
Andres Iniesta, 34

Vous pouvez effectuer l'opération requise comme suit:

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 Voir

3
répondu Pransh Tiwari 2018-07-23 15:35:33

J'avais besoin d'un lecteur csv asynchrone et j'ai essayé à l'origine la réponse de @Pransh Tiwari mais je n'ai pas pu le 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);
    });
};
0
répondu alexkb 2018-09-06 07:55:58
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
répondu swapnil 2018-09-10 07:22:05

Npm installer csv

Exemple de fichier CSV Vous allez avoir besoin d'un fichier CSV pour analyser, donc soit vous en avez déjà un, soit vous pouvez copier le texte ci-dessous et le coller dans un nouveau fichier et appeler ce fichier "mycsv.csv "

ABC, 123, Fudge
532, CWE, ICECREAM
8023, POOP, DOGS
441, CHEESE, CARMEL
221, ABC, HOUSE
1
ABC, 123, Fudge
2
532, CWE, ICECREAM
3
8023, POOP, DOGS
4
441, CHEESE, CARMEL
5
221, ABC, HOUSE

Exemple de lecture de Code et D'analyse du fichier CSV

Créez un nouveau fichier et insérez-y le code suivant. Assurez-vous de lire ce qui se passe dans les coulisses.

    var csv = require('csv'); 
    // loads the csv module referenced above.

    var obj = csv(); 
    // gets the csv module to access the required functionality

    function MyCSV(Fone, Ftwo, Fthree) {
        this.FieldOne = Fone;
        this.FieldTwo = Ftwo;
        this.FieldThree = Fthree;
    }; 
    // Define the MyCSV object with parameterized constructor, this will be used for storing the data read from the csv into an array of MyCSV. You will need to define each field as shown above.

    var MyData = []; 
    // MyData array will contain the data from the CSV file and it will be sent to the clients request over HTTP. 

    obj.from.path('../THEPATHINYOURPROJECT/TOTHE/csv_FILE_YOU_WANT_TO_LOAD.csv').to.array(function (data) {
        for (var index = 0; index < data.length; index++) {
            MyData.push(new MyCSV(data[index][0], data[index][1], data[index][2]));
        }
        console.log(MyData);
    });
    //Reads the CSV file from the path you specify, and the data is stored in the array we specified using callback function.  This function iterates through an array and each line from the CSV file will be pushed as a record to another array called MyData , and logs the data into the console to ensure it worked.

var http = require('http');
//Load the http module.

var server = http.createServer(function (req, resp) {
    resp.writeHead(200, { 'content-type': 'application/json' });
    resp.end(JSON.stringify(MyData));
});
// Create a webserver with a request listener callback.  This will write the response header with the content type as json, and end the response by sending the MyData array in JSON format.

server.listen(8080);
// Tells the webserver to listen on port 8080(obviously this may be whatever port you want.)
1
var csv = require('csv'); 
2
// loads the csv module referenced above.
3
​
4
var obj = csv(); 
5
// gets the csv module to access the required functionality
6
​
7
function MyCSV(Fone, Ftwo, Fthree) {
8
    this.FieldOne = Fone;
9
    this.FieldTwo = Ftwo;
10
    this.FieldThree = Fthree;
11
}; 
12
// Define the MyCSV object with parameterized constructor, this will be used for storing the data read from the csv into an array of MyCSV. You will need to define each field as shown above.
13
​
14
var MyData = []; 
15
// MyData array will contain the data from the CSV file and it will be sent to the clients request over HTTP. 
16
​
17
obj.from.path('../THEPATHINYOURPROJECT/TOTHE/csv_FILE_YOU_WANT_TO_LOAD.csv').to.array(function (data) {
18
    for (var index = 0; index < data.length; index++) {
19
        MyData.push(new MyCSV(data[index][0], data[index][1], data[index][2]));
20
    }
21
    console.log(MyData);
22
});
23
//Reads the CSV file from the path you specify, and the data is stored in the array we specified using callback function.  This function iterates through an array and each line from the CSV file will be pushed as a record to another array called MyData , and logs the data into the console to ensure it worked.
24
​
25
var http = require('http');
26
//Load the http module.
27
​
28
var server = http.createServer(function (req, resp) {
29
    resp.writeHead(200, { 'content-type': 'application/json' });
30
    resp.end(JSON.stringify(MyData));
31
});
32
// Create a webserver with a request listener callback.  This will write the response header with the content type as json, and end the response by sending the MyData array in JSON format.
33
​
34
server.listen(8080);
35
// Tells the webserver to listen on port 8080(obviously this may be whatever port you want.)
Things to be aware of in your app.js code
In lines 7 through 11, we define the function called 'MyCSV' and the field names.

If your CSV file has multiple columns make sure you define this correctly to match your file.

On line 17 we define the location of the CSV file of which we are loading.  Make sure you use the correct path here.

Démarrez votre application et vérifiez la fonctionnalité Ouvrez une console et tapez commande suivante:

Application de Noeud 1 Nœud app Vous devriez voir la sortie suivante dans votre console:

[  MYCSV { Fieldone: 'ABC', Fieldtwo: '123', Fieldthree: 'Fudge' },
   MYCSV { Fieldone: '532', Fieldtwo: 'CWE', Fieldthree: 'ICECREAM' },
   MYCSV { Fieldone: '8023', Fieldtwo: 'POOP', Fieldthree: 'DOGS' },
   MYCSV { Fieldone: '441', Fieldtwo: 'CHEESE', Fieldthree: 'CARMEL' },
   MYCSV { Fieldone: '221', Fieldtwo: 'ABC', Fieldthree: 'HOUSE' }, ]

1 [ MYCSV { Fieldone: 'ABC', Fieldtwo: '123', Fieldthree: 'Fudge' }, 2 MYCSV { Fieldone: '532', Fieldtwo: 'CWE', Fieldthree:'glace' }, 3 MYCSV { Fieldone: '8023', Fieldtwo: 'Merde', Fieldthree: 'chiens' }, 4 MYCSV { Fieldone: '441', Fieldtwo: 'CHEESE', Fieldthree: 'CARMEL' }, 5 MYCSV { Fieldone: '221', Fieldtwo: 'ABC', Fieldthree: 'maison' }, ] Maintenant, vous devez ouvrir un navigateur web et naviguer vers votre serveur. Vous devriez le voir sortir les données au format JSON.

Conclusion En utilisant node.JS et son module CSV nous pouvons rapidement et facilement lire et utiliser les données stockées sur le serveur et les rendre disponibles au client sur demande

-1
répondu Rubin bhandari 2018-05-31 14:56:26