NodeJs leyendo el archivo csv

Con nodejs quiero analizar un archivo .csv de 10000 registros y hacer alguna operación en cada fila. Intenté usar http://www.adaltas.com/projects/node-csv . No pude conseguir que esto se detuviera en cada fila. Esto acaba de leer a través de todos los 10000 registros. Necesito hacer lo siguiente

1) leer csv línea por línea 2) realizar una operación que consume mucho tiempo en cada línea 3) ir a la siguiente línea

¿Puede alguien sugerir alguna idea alternativa aquí?

Parece que necesitas usar alguna solución basada en flujo, ya existían tales bibliotecas, así que antes de reinventarte, prueba esta biblioteca, que también incluye soporte de validación. https://www.npmjs.org/package/fast-csv

Mi solución actual usa el módulo asíncrono para ejecutarse en serie:

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); 

Utilicé de esta manera: –

 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); }); 

El proyecto node-csv al que hace referencia es completamente suficiente para la tarea de transformar cada fila de una gran parte de los datos CSV, desde los documentos en: 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()); }); }); 

Desde mi experiencia, puedo decir que también es una implementación bastante rápida, he estado trabajando con ella en conjuntos de datos con cerca de 10k registros y los tiempos de procesamiento fueron de un nivel razonable de decenas de milisegundos para todo el conjunto.

Rearding la sugerencia de solución basada en el flujo de jurka : node-csv IS se basa en el flujo y sigue la API de transmisión de Node.js.

Para pausar la transmisión en fast-csv puede hacer lo siguiente:

 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) }); 

Prueba el plugin npm línea por línea.

 npm install line-by-line --save 
  • Esta solución utiliza csv-parser lugar de csv-parse utilizado en algunas de las respuestas anteriores.
  • csv-parser vino alrededor de 2 años después de csv-parse .
  • Ambos resuelven el mismo propósito, pero personalmente he encontrado mejor csv-parser , ya que es fácil manejar los encabezados a través de él.

Instale el csv-parser primero:

 npm install csv-parser 

Supongamos que tienes un archivo csv como este:

 NAME, AGE Lionel Messi, 31 Andres Iniesta, 34 

Puede realizar la operación requerida como:

 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 }); 

Para más información consulte

El módulo npm de Fast-CSV puede leer datos línea por línea desde el archivo csv.

Aquí hay un ejemplo:

 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"); }); 

Necesitaba un lector csv asíncrono y originalmente probé la respuesta de @Pransh Tiwari, pero no pude hacer que funcionara con util.promisify() y util.promisify() . Finalmente me encontré con node-csvtojson , que prácticamente hace lo mismo que csv-parser, pero con promesas. Aquí hay un ejemplo de uso de csvtojson en acción:

 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 instalar csv

Ejemplo de archivo CSV Necesitará un archivo CSV para analizar, así que ya tiene uno o puede copiar el texto a continuación y pegarlo en un nuevo archivo y llamar a ese archivo “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 

Ejemplo de lectura de código y análisis del archivo CSV

Cree un nuevo archivo e inserte el siguiente código en él. Asegúrese de leer a través de lo que está sucediendo detrás de las escenas.

  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. 

Inicie su aplicación y verifique la funcionalidad Abra una consola y escriba el siguiente comando:

Aplicación de nodo 1 Aplicación de nodo Debe ver el siguiente resultado en su consola:

 [ 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: 'ICECREAM'}, 3 MYCSV {Fieldone: '8023', Fieldtwo: 'POOP', Fieldthree: 'PERROS'}, 4 MYCSV {Fieldone: '441', Fieldtwo: 'CHEESE', Fieldthree: 'CARMEL'}, 5 MYCSV {Fieldone: '221', Fieldtwo: 'ABC', Fieldthree: 'HOUSE'},] Ahora debes abrir un navegador web y navegar a tu servidor. Deberías verlo dar salida a los datos en formato JSON.

Conclusión Al usar node.js y su módulo CSV, podemos leer y usar rápida y fácilmente los datos almacenados en el servidor y ponerlos a disposición del cliente a pedido.