2

我正在尝试使用 fast-csv 库解析 csv 文件并将每个值数字或字符串转换为创建二维数组。但我无法在 ReadStream 中返回数组。你能给我关于我的代码的建议吗?

const fs = require("fs");
const csv = require("fast-csv");

async csvParse(){

  let array = [];
  
  options = {
    map(value){
      // convert value's column type to number or string
    }
  }

  fs.createReadStream(csvfile)
      .pipe(csv.parse(options))
      .on("error", error => console.log(error))
      .on("data", data => array.push(data))
      .on("end", function(){
         console.log(array);
         return array;
      })
}

输入

name,date,score,id
John,2020-01-01,1000,10

预期产出

[["name", "date", "score", "id"], ["John", "2020-01-01", 1000, 10]]

实际产出

// no output

我希望代码返回从“输入”转换的“预期输出”,但它没有返回。我知道这是因为我试图从匿名函数 on() 返回一个值,但是我不知道正确的方法。

4

1 回答 1

1

您可以将文件流和 csv 转换的处理包装在一个 Promise 中,并在end-event 发出后解决该 Promise:

const fs = require("fs");
const csv = require("fast-csv");

function csvParse() {

    const options = {
        // your options here
    }
    let array = [];
    return new Promise((resolve, reject) => {
        fs.createReadStream(csvfile)
        .pipe(csv.parse(options))
        .on("error", error => reject(error))
        .on("data", data => array.push(data))
        .on("end", () => {
            console.log(array);
            resolve(array);
        });
    });

}

然后像这样调用它:

(async() => {
    const result = await csvParse();
})();
于 2020-06-28T15:36:12.410 回答