首页 > 解决方案 > 在将 csv 读取到数组时理解 Node / Promise(从 Promise 中获取值)

问题描述

我想将 .csv 文件读入数组,获取读取的行数,然后将数组发送到另一个函数以进行额外处理。

我搜索并找到了一些有效的示例代码(除了能够从承诺中获取值)。

const csv = require('csv-parser')

async function readCsv(csv_file_path) {

    const list = []     // read .csv into array (list)
    var num_rows = 0    // the number of rows read

    fs.createReadStream(csv_file)
        .pipe(csv())
        .on('data', (data) => list.push(data))
        .on('end', () => {
            num_rows = list.length
            console.log('num_rows', num_rows) // prints num rows read, fine
        })

    // now, here, at this point in the code, I want to use:
    //  1. num_rows
    //  2. address_list outside fo the fs.createReadStream function
    // how do I do this?

    // Here, outside, num_rows is 0, and nothing is in the list
    console.log('num_rows:', num_rows)
    for (let address of address_list) {
        console.log('address:', address);
    }

    // how do I get the value for num_rows, and contents of list[] set,
    // so I can use here at this point in the code?
}

标签: node.jscsvpromisees6-promise

解决方案


我建议您使用库进行.csv解析。一个好的是csv-parse,您可以使用npm.

这是一个使用同步 API 的简单示例。

const parse = require('csv-parse/lib/sync')

const input = `
"key_1","key_2"
"value 1","value 2"
"value 3","value 3"
`
const records = parse(input, {
  skip_empty_lines: true
})

console.log(records)

// Output:
// [ [ 'key_1', 'key_2' ],
// [ 'value 1', 'value 2' ],
// [ 'value 3', 'value 3' ] ]
// Just get the length of the output array to get the number of rows in the file

您可以在此处找到 API 文档。


推荐阅读