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
Quelqu'un peut-il s'il vous plaît suggérer des idées alternatives ici?
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
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);
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);
});
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.
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)
});
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
. 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
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);
});
};
Essayez le plugin npm ligne par ligne.
npm install line-by-line --save
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');
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);
Vous pouvez convertir csv au format json à l’aide du module csv-to-json et utiliser facilement le fichier json dans votre programme
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));
})