【问题标题】:Accessing Parsed CSV data , CSV-Parser Node.js访问解析的 CSV 数据,CSV-Parser Node.js
【发布时间】:2020-10-29 02:28:53
【问题描述】:

我正在使用 csv-parser npm 包并进行示例 csv 解析。我唯一的困惑是在运行这些函数后访问已解析的数组。我知道我在 .on('data') 中推送数据,然后在 .on('end'); 中执行 console.log(results); 语句以显示正在存储的内容。为什么我在运行这些函数后尝试访问results 时会得到未定义。 results不获取存储的信息吗?

const csv = require('csv-parser');
const fs = require('fs');
const results = [];


fs.createReadStream('demo.csv')
.pipe(csv())
.on('data', (data) => results.push(data))
.on('end', () => {
    console.log(results);
});

【问题讨论】:

  • csv() 调用中删除()
  • 我刚刚尝试运行您的代码,但没有任何问题(节点 v12.16.2)。你确定 demo.csv 不是空文件吗?
  • @RandyCasburn 感谢您的评论,但我仍然收到Type Error: dest.on is not a function
  • @A.DUPONCHEL demo.csv 有两行,分别是 ID 和电子邮件列。我可以在 .on('end', () => { console.log(results);}); 中得到结果,但是如果我在 createReadStream 之后放置 console.log() ,结果是未定义的,这有意义吗?
  • 当您删除() 并得到dest.on is not a function 时,这意味着csv() 函数没有返回带有on() 方法的对象。这很可能意味着 csv() 没有返回 Stream。

标签: javascript node.js csv


【解决方案1】:

我可以在 .on('end', () => { console.log(results);}); , 但 如果我在 createReadStream 之后放置一个 console.log() ,结果是 未定义,这有意义吗? – Videoaddict101

您的流是异步操作的,这意味着您的 data 和您的 end 处理程序将在稍后被调用,同时您的 javascript 将继续执行。因此,在 fs.createReadStream 指令之后访问您的数组将导致一个空数组。

理解 async 对使用 javascript 非常重要,对于 nodejs 更是如此。

请查看用于处理异步的不同资源,例如 PromiseAsync/Await ...

【讨论】:

    【解决方案2】:

    我来这里是为了找到相同问题的解决方案。 因为这是一个async 操作,所以这里的工作是在调​​用end 处理程序后调用作用于解析数据的函数。在这种情况下,这样的东西应该可以工作:

    const csv = require('csv-parser');
    const fs = require('fs');
    const results = [];
    
    fs.createReadStream('demo.csv')
    .pipe(csv())
    .on('data', (data) => results.push(data))
    .on('end', () => {
        console.log(results);
        csvData(results);
    });
    
    const csvData = ((csvInfo) => {
        console.log(csvInfo);
        console.log(csvInfo.length);
    })
    

    【讨论】:

      【解决方案3】:

      你应该neat-csv 这是csv-parser 的认可包装器,它为你提供了一个承诺接口。

      也就是说,您可以创建一个承诺并在 on("end", callback) 中解决它

      import fs from "fs";
      import csv from "csv-parser";
      
      function getCsv(filename) {
        return new Promise((resolve, reject) => {
          const data = [];
          fs.createReadStream(filename)
            .pipe(csv())
            .on("error", (error) => reject(error))
            .on("data", (row) => data.push(row))
            .on("end", () => resolve(data));
        });
      }
      
      console.log(await getCsv("../assets/logfile0.csv"));
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2021-02-07
        • 2020-07-16
        • 2023-04-07
        • 2016-12-31
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多