Quiero registrar algunos datos provenientes de un archivo CSV usando un bucle for para cada línea. Cuando finaliza el ciclo for, quiero que registre "hecho", pero parece que registra "hecho" antes de la última línea del archivo csv det... Archivo CSV:
CHANNEL,TITLE,TEXT EzaguesTesting,TITLE TIL SR 1,TEKST TIL SR 1 EzaguesTesting2,TITLE TIL SR 2,TEKST TIL SR 2 EzaguesTesting3,TITLE TIL SR 3,TEKST TIL SR 3 EzaguesTesting4,TITLE TIL SR 4,TEKST TIL SR 4 EzaguesTesting5,TITLE TIL SR 5,TEKST TIL SR 5El código que debería registrarlo:
fs.readdir(dirPath, async function (err, lines) { for await (const line of lines) { await new Promise(resolve => { fs.createReadStream(dirPath + line) .pipe(csv()) .on('data', data => { console.log('SR: ' + data.CHANNEL + ' Titel: ' + data.TITLE + ' Tekst: ' + data.TEXT); resolve(true); }); }) } console.log('done'); })Todo parece funcionar bien, aparte del hecho de que registra "hecho" una línea antes de tiempo...
Resuelve su Promesa en 'datos'. Significa que, tan pronto como su transmisión le envíe el primer fragmento, resolverá la Promesa solo con este fragmento.
Debe devolver el resultado .on('end') .
const files = await fs.promises.readdir(dirPath); for (const file of files) { await new Promise(resolve => { let result fs.createReadStream(dirPath + line) .pipe(csv()) .on('data', data => { result = data; }) .on('end', () => resolve(result)); }) } console.log('done'); He realizado algunos otros cambios, como usar la versión Promise de fs.readdir y también cambiar el nombre de lines a files (obtiene nombres de archivos, no líneas).