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 hacer que esto se detuviera en cada fila. Esto solo lee todos los 10000 registros. Necesito hacer lo siguiente:
- leer csv línea por línea
- realizar operaciones que requieren mucho tiempo en cada línea
- ir a la siguiente línea
¿Alguien puede sugerir alguna idea alternativa aquí?
Respuestas:
Parece que necesita usar alguna solución basada en flujo, ya existían tales bibliotecas, así que antes de reinventarse, pruebe esta biblioteca, que también incluye soporte de validación. https://www.npmjs.org/package/fast-csv
fuente
Usé de esta manera: -
fuente
parse
no está definido. ¿Se me escapa algo? Cuando ejecutonpm install csv-parse
y luego en mi código agregovar parse = require("csv-parse");
, entonces funciona. ¿Estás seguro de que el tuyo funciona? De cualquier manera, me encanta esta solución (incluso si tengo que incluir elcsv-parse
módulocsv-parse
módulo.Mi solución actual usa el módulo async para ejecutar en serie:
fuente
csv-parser
lugar decsv-parse
usarse en algunas de las respuestas anteriores.csv-parser
vino alrededor de 2 años despuéscsv-parse
.csv-parser
mejor, ya que es fácil manejar encabezados a través de él.Instale el csv-parser primero:
Entonces, suponga que tiene un archivo csv como este:
Puede realizar la operación requerida como:
Para obtener más información, consulte
fuente
Para pausar la transmisión en fast-csv , puede hacer lo siguiente:
fuente
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, de los documentos en: http://csv.adaltas.com/transform/ :
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 estaban en un nivel razonable de decenas de milisegundos para todo el conjunto.
Con respecto a la sugerencia de solución basada en flujo de jurka : node-csv IS basado en flujo y sigue la API de transmisión de Node.js.
fuente
El módulo npm fast-csv puede leer datos línea por línea desde el archivo csv.
Aquí hay un ejemplo:
fuente
fromStream()
y su sitio de proyecto carece de ejemplos y documentación.Necesitaba un lector csv asíncrono y originalmente probé la respuesta de @Pransh Tiwari, pero no pude hacer que funcionara con
await
yutil.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:fuente
Pruebe el complemento npm línea por línea.
fuente
esta es mi solución para obtener el archivo csv de la URL externa
fuente
Solución alternativa para realizar esta tarea con await / async :
fuente
Ok, hay muchas respuestas aquí y no creo que respondan a tu pregunta, que creo que es similar a la mía.
Debe realizar una operación como ponerse en contacto con una base de datos o una API de terceros que llevará tiempo y es asincrónica. No desea cargar todo el documento en la memoria debido a que es demasiado grande o por alguna otra razón, por lo que debe leer línea por línea para procesar.
He leído los documentos fs y puede pausar en la lectura, pero el uso de la llamada .on ('data') hará que sea continuo cuál de estas respuestas usa y causa el problema.
ACTUALIZACIÓN: Sé más información sobre Streams de la que nunca quise
La mejor forma de hacer esto es crear un flujo de escritura. Esto canalizará los datos csv a su flujo de escritura que puede administrar las llamadas asyncronus. La tubería administrará el búfer hasta el lector para que no termine con un uso intensivo de la memoria
Versión simple
Versión de clase
MÉTODO ANTIGUO:
PROBLEMA CON legible
Notarás una
reading
bandera. He notado que, por alguna razón, cerca del final del archivo, el .on ('legible') se llama por segunda vez en archivos pequeños y grandes. No estoy seguro de por qué, pero esto bloquea eso de un segundo proceso que lee las mismas líneas de pedido.fuente
Yo uso este simple: https://www.npmjs.com/package/csv-parser
Muy simple de usar:
fuente
Estaba usando,
csv-parse
pero para archivos más grandes tenía problemas de rendimiento, una de las mejores bibliotecas que he encontrado es Papa Parse , los documentos son buenos, buen soporte, liviano, sin dependencias.Instalar en pc
papaparse
Uso:
La nota
header: true
es una opción en la configuración, consulte los documentos para ver otras opcionesfuente
fuente
Puede convertir csv a formato json usando el módulo csv-to-json y luego puede usar fácilmente el archivo json en su programa
fuente
npm instalar csv
Ejemplo de archivo CSV Necesitará un archivo CSV para analizar, por lo que ya tiene uno o puede copiar el texto a continuación y pegarlo en un archivo nuevo y llamar a ese archivo "mycsv.csv"
Ejemplo de lectura y análisis de código del archivo CSV
Cree un nuevo archivo e inserte el siguiente código en él. Asegúrese de leer detenidamente lo que sucede detrás de escena.
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 Debería ver el siguiente resultado en su consola:
1 [MYCSV {Fieldone: 'ABC', Fieldtwo: '123', Fieldthree: 'Fudge'}, 2 MYCSV {Fieldone: '532', Fieldtwo: 'CWE', Fieldthree: 'ICECREAM'}, 3 MYCSV {Fieldone: '8023', Fieldtwo: 'POOP', Fieldthree: 'DOGS'}, 4 MYCSV {Fieldone: '441', Fieldtwo: 'CHEESE', Fieldthree: 'CARMEL'}, 5 MYCSV {Fieldone: '221', Fieldtwo: 'ABC', Fieldthree: 'HOUSE'},] Ahora debe abrir un navegador web y navegar hasta su servidor. Debería ver que genera los datos en formato JSON.
Conclusión Usando 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 cuando lo solicite
fuente