TypeScript中使用csv-parse填充数组失败问题求助
问题:TypeScript中使用csv-parse读取数据无法推入数组
我是TypeScript新手,用csv-parse库读取CSV文件,在parse函数的回调里调用createData创建CSVData对象并推入数组。控制台能打印CSV数据,但数组始终是空的,执行console.log(readData())输出空数组。
相关代码
CSVData类:
export class CSVData { private firstName: string; private lastName: string; private gender: string; constructor(firstName: string, lastName: string, gender: string) { this.firstName = firstName; this.lastName = lastName; this.gender = gender; } }
读取数据的方法:
readData(): CSVData[] { const csvFilePath = path.resolve(__dirname, '../test-file.csv'); const headers = ['first_name', 'last_name', 'gender']; const fileContent = fs.readFileSync(csvFilePath, { encoding: 'utf-8' }); const data: CSVData[] = []; parse(fileContent, { delimiter: ',', from_line: 2, columns: headers, }, (error, result: DataType[]) => { if (error) { console.error(error); } this.createData(data, result); }); return data; }; createData(newData: CSVData[], data: DataType[]): void { console.log(data.length); for (let i = 0; i < data.length; i++) { let dataObj: CSVData = new CSVData(data[i].first_name, data[i].last_name, data[i].gender); newData.push(dataObj); } }
更新说明:使用的是csv-parse的parse方法:
const { parse } = require("csv-parse");
解决方案
核心问题是csv-parse的parse方法是异步执行的:readData函数在parse的回调函数触发前就已经返回了空数组,此时回调里的createData还没来得及往数组里推数据。
有两种常用解决方法:
方法1:用Promise封装异步操作
把readData改成返回Promise,等待parse完成后再返回数据:
async readData(): Promise<CSVData[]> { const csvFilePath = path.resolve(__dirname, '../test-file.csv'); const headers = ['first_name', 'last_name', 'gender']; const fileContent = fs.readFileSync(csvFilePath, { encoding: 'utf-8' }); return new Promise((resolve, reject) => { const data: CSVData[] = []; parse(fileContent, { delimiter: ',', from_line: 2, columns: headers, }, (error, result: DataType[]) => { if (error) { console.error(error); reject(error); return; } this.createData(data, result); resolve(data); }); }); } // 调用示例 // readData().then(data => console.log(data)); // 或在async函数中使用await:const data = await readData();
方法2:使用csv-parse的同步API
如果处理的是小文件,直接用parse.sync同步解析,不需要回调:
readData(): CSVData[] { const csvFilePath = path.resolve(__dirname, '../test-file.csv'); const headers = ['first_name', 'last_name', 'gender']; const fileContent = fs.readFileSync(csvFilePath, { encoding: 'utf-8' }); // 同步解析CSV内容 const result: DataType[] = parse.sync(fileContent, { delimiter: ',', from_line: 2, columns: headers, }); const data: CSVData[] = []; this.createData(data, result); return data; } // 调用方式不变:console.log(readData());
内容的提问来源于stack exchange,提问作者Spam Garbage
相关产品推荐
相关产品推荐

