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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.25 22:23:19