Search code examples
node.jspromisereadfile

How to set a value to a variable from a csv file (node.js)


I am trying to return a random value from a list of numbers stored in a csv file. However, when trying to parse the csv and set a value a promise is returned instead of a value.

const fs  = require('fs')

async function getRemainingItem() {
  await fs.readFileSync('remaining-items.csv', 'utf8', (err, data) => {
    if (err) {}
    let linesExceptFirst = data.split('\n').slice(1)
    let num = Math.floor(Math.random() * linesExceptFirst.length)
    let linesArr = linesExceptFirst.map(line=>line.split(','))
    return linesArr[num][0]
  });
}

let item = getRemainingItem()
console.log(item)

How can I return a random number from a csv that contains a list of numbers?


Solution

  • You are using the readFileSync method, which await is not needed with.

    const fs = require('fs')
    
    function getRemainingItem() {
        const data = fs.readFileSync('remaining-items.csv', 'utf8');
        const linesExceptFirst = data.split('\n').slice(1);
        const num = Math.floor(Math.random() * linesExceptFirst.length);
        const linesArr = linesExceptFirst.map(line=>line.split(','));
        return linesArr[num][0];
    }
    
    const item = getRemainingItem();
    console.log(item);
    

    If you want the file to be read asynchronously and not block the execution process, then this can be done like this:

    const fs = require('fs');
    const fsp = fs.promises;
    
    async function getRemainingItem() {
        const data = await fsp.readFile('remaining-items.csv', 'utf8');
        const linesExceptFirst = data.split('\n').slice(1);
        const num = Math.floor(Math.random() * linesExceptFirst.length);
        const linesArr = linesExceptFirst.map(line=>line.split(','));
        return linesArr[num][0];
    }
    
    async function main() {
        const item = await getRemainingItem();
        console.log(item);
    }
    
    main();