Aquí está el código que estoy ejecutando
const fs = require('fs'); const csvParse = require('csv-parse'); function getValue() { let results = []; fs.createReadStream('./assets/myCSV.csv') .pipe(csvParse({delimiter: '\n'})) .on('data', (data) => results.push(data)) .on('error', (err => { console.log(`csv-parse error from getValue: ${err}`); })) .on('end', () => { console.log('finished!'); let csvLength = Object.keys(results).length; // getting a random value within the csv min = Math.ceil(0); max = Math.floor(csvLength); let randomNumber = Math.floor(Math.random() * (max - min + 1)) + min; let randomCSVLine = results[randomNumber]; console.log(randomCSVLine); return randomCSVLine; }); } console.log(`mine: ${getValue()}`);aquí están los resultados y no sé por qué no se muestra el valor. Creo que podría ser un problema asíncrono, pero aún no estoy seguro de cómo resolverlo:
mine: undefined finished! [ '10' ]Creo que aquí encontrarás la solución.
CSV Parser para el uso de Promesas de Node.js
A partir de la versión 15 de Node.js, la API Stream promete un nuevo módulo "stream/promises".
Parte del módulo Stream Promises es la función terminada. La función se conecta a una secuencia y resuelve una promesa cuando ya no se puede leer, escribir o ha experimentado un error o un evento de cierre prematuro.
El ejemplo de promesas aprovecha la canalización y el acabado para proporcionar una solución conveniente para leer un archivo del sistema de archivos y canalizar su salida al analizador.
Este ejemplo está disponible con el nodo de comando samples/recipe.promises.js.
const parse = require('csv-parse'); const fs = require('fs'); const { finished } = require('stream/promises'); const processFile = async () => { records = [] const parser = fs .createReadStream(`${__dirname}/fs_read.csv`) .pipe(parse({ // CSV options if any })); parser.on('readable', function(){ let record; while (record = parser.read()) { // Work with each record records.push(record) } }); await finished(parser); return records } (async () => { const records = await processFile() console.info(records); })()Solo necesita hacer los mismos cambios en su código para lograr los resultados deseados.