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?
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
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);
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);
});
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.
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)
});
Essayez le plugin npm ligne par ligne.
npm install line-by-line --save
- Cette solution utilise
csv-parser
au lieu decsv-parse
utilisé dans certains les réponses ci-dessus. -
csv-parser
est venu environ 2 ans aprèscsv-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
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);
});
};
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));
})
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