Lea un archivo CSV línea por línea usando las funciones node.js y ES6 / ES7

Leer un archivo CSV línea por línea (es decir, sin cargar todo el archivo en la memoria) en Python es simple:

import csv for row in csv.reader(open("file.csv")): print(row[0]) 

Hacer lo mismo con node.js implica usar algo como node-csv , flujos y devoluciones de llamada.

¿Es posible usar las nuevas funciones de ES6 / ES7 como iteradores, generadores, promesas y funciones asíncronas para iterar sobre las líneas de un archivo CSV de una manera que se parezca más al código Python?

Idealmente me gustaría poder escribir algo como esto:

 for (const row of csvOpen('file.csv')) { console.log(row[0]); } 

(de nuevo, sin cargar todo el archivo en la memoria a la vez.)

No estoy familiarizado con node-csv, pero parece que un iterador que usa un generador debería hacerlo. Solo envuelve eso alrededor de cualquier API de callback asíncrona:

 let dummyReader = { testFile: ["row1", "row2", "row3"], read: function(cb) { return Promise.resolve().then(() => cb(this.testFile.shift())).catch(failed); }, end: function() { return !this.testFile.length; } } let csvOpen = url => { let iter = {}; iter[Symbol.iterator] = function* () { while (!dummyReader.end()) { yield new Promise(resolve => dummyReader.read(resolve)); } } return iter; }; async function test() { // The line you wanted: for (let row of csvOpen('file.csv')) { console.log(await row); } } test(); // row1, row2, row3 var failed = e => console.log(e.name +": "+ e.message); 

Tenga en cuenta que la row aquí es una promesa, pero lo suficientemente cerca.

Pégalo en babel .