You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

NodeJS使用promised-csv读取CSV文件返回空数组问题求助

解决promised-csv读取CSV返回空数组的问题

嘿,你这是踩了异步操作的经典坑啦!promised-csv是基于事件驱动的异步模块,但你的函数在调用reader.read()之后立刻就返回了output数组——这时候CSV文件还没开始读取呢,row事件根本没触发,返回空数组也就不奇怪了。

两种靠谱的解决办法

办法1:用Promise封装异步逻辑

我们可以把整个读取过程包成一个Promise,等end事件触发(也就是文件读完了)再返回结果,这样就能保证拿到完整的数据:

const inputFile = './test/example_result.csv'; // 注意路径里的反斜杠要转义,或者直接用正斜杠更稳妥
const CsvReader = require('promised-csv');

function readCSV(inputFile) {
  return new Promise((resolve, reject) => {
    const reader = new CsvReader();
    const output = [];

    reader.on('row', (data) => {
      output.push(data[0]);
    });

    // 读完文件后返回结果
    reader.on('end', () => {
      resolve(output);
    });

    // 别忘了处理错误
    reader.on('error', (err) => {
      reject(err);
    });

    reader.read(inputFile);
  });
}

// 调用的时候得用异步方式,比如async/await
async function runTest() {
  try {
    const csvData = await readCSV(inputFile);
    console.log(csvData); // 这里就能拿到完整的字符串数组啦
  } catch (err) {
    console.error('读取CSV出错:', err);
  }
}

runTest();

办法2:直接用模块的Promise风格API

其实promised-csv本身就提供了Promise形式的readAll方法,用它更简洁,不用自己监听事件:

const inputFile = './test/example_result.csv';
const CsvReader = require('promised-csv');

async function readCSV(inputFile) {
  const reader = new CsvReader();
  // readAll会返回所有行的数组,我们再提取每行第一个元素
  const allRows = await reader.readAll(inputFile);
  return allRows.map(row => row[0]);
}

// 调用示例,用.then/.catch也可以
readCSV(inputFile)
  .then(result => console.log('读取结果:', result))
  .catch(err => console.error('出错了:', err));

额外提醒

  • 你原来的路径写的是.\test\example_result.csv,Windows下反斜杠要写成\\,或者直接用正斜杠/,不然会被当成转义字符,导致路径找不到文件——这也可能是隐藏的问题哦。
  • 做单元测试的时候,记得用异步测试的写法(比如Jest里用async/await或者done回调),不然测试会在读取完成前就断言,结果还是不对。

内容的提问来源于stack exchange,提问作者Antona

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 07:16:23