csv-parse解析CSV无输出无报错,请求技术排查
问题描述
使用csv@6.2.0版本的csv-parse模块编写Node.js代码,预期打印CSV中的记录,但运行后无任何输出也不抛出错误。CSV文件与index.js同目录,内容如下:
userId,prefChannel 1,push.pref 2,email.pref 3,email.pref 4,email.pref 5,push.pref 6,push.pref 7,email.pref 8,push.pref 9,email.pref 10,push.pref
现有index.js代码:
const fs = require("fs"); const { parse } = require('csv-parse'); async function readRecordsFromCSV() { const cvsFileName = (__dirname + SETTINGS.filePath); console.info(chalk.green(`Streaming file: ${cvsFileName}`)); // read csv file const parser = parse({delimiter: ','}, function(err, data){ console.log(data); console.log(err); }); fs.createReadStream(cvsFileName).pipe(parser); } // driver code: // Run the script ; (async function () { // read and transform all items from csv file const newPrefs_1 = await transformPreferenceRecordsFromCSV(); })()
执行脚本仅输出Streaming file: {correct file path}/.../bq-results-10-records-test.csv,无记录或错误信息输出。
问题排查与修复
1. 函数调用不匹配
定义的读取CSV函数是readRecordsFromCSV,但驱动代码里调用的是transformPreferenceRecordsFromCSV,导致读取CSV的逻辑根本没执行。
2. 未处理流的异步完成
csv-parse的回调模式基于流实现,当前代码的async函数没有返回Promise,脚本可能在流处理完成前就退出,无法触发回调打印数据。
3. 缺失依赖引入
代码中使用了chalk但未引入,虽不会直接导致无输出,但会引发错误,需补充引入。
修复后的完整代码
const fs = require("fs"); const { parse } = require('csv-parse'); const chalk = require('chalk'); // 假设SETTINGS为已定义的配置对象 const SETTINGS = { filePath: '/bq-results-10-records-test.csv' }; async function readRecordsFromCSV() { const cvsFileName = (__dirname + SETTINGS.filePath); console.info(chalk.green(`Streaming file: ${cvsFileName}`)); // 用Promise包裹流处理,适配async/await语法 return new Promise((resolve, reject) => { const parser = parse({ delimiter: ',' }, (err, data) => { if (err) { console.error(err); reject(err); return; } console.log(data); resolve(data); }); fs.createReadStream(cvsFileName) .pipe(parser) .on('error', (err) => { console.error('文件读取出错:', err); reject(err); }); }); } // 驱动代码 (async function () { try { // 调用正确的读取函数 const newPrefs_1 = await readRecordsFromCSV(); // 可在此处继续处理读取到的记录 } catch (err) { console.error('脚本执行出错:', err); } })();
额外说明
- 若不需要异步等待,也可直接监听
parser的end事件,但用Promise包裹更适配async/await写法。 - 需确保
SETTINGS.filePath的路径格式正确,开头的/需根据实际路径拼接情况调整,避免路径错误。
内容的提问来源于stack exchange,提问作者Code freeeeeeeze
相关产品推荐
相关产品推荐

