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

如何使用nest-csv-parser解析嵌套结构的CSV数据?

使用nest-csv-parser解析嵌套类结构失败

问题背景

我在TypeScript中定义了如下嵌套类结构:

export class Vehicle {
  id: string;
  brand: string;
  owner: Owner;
}
export class Owner {
  id: string;
  name: string;
}

需要从以分号分隔的CSV文件中加载数据,CSV格式如下:

id;brand;owner.id;owner.name
1;mazda;100;James
...

当前使用nest-csv-parser解析时,id和brand字段能正常加载,但owner嵌套字段无法被识别,解析代码如下:

const stream = fs.createReadStream('/path/to/file.csv');
const entities = await this.csvParser.parse(stream, Vehicle, undefined, undefined, { separator: ';'});

已导入Nest提供的CsvParser模块,请问如何实现嵌套结构的成功解析?


解决方案

nest-csv-parser底层依赖csv-parser包,默认不会自动解析点分隔的嵌套字段,可通过以下几种方式实现:

方法1:用map选项转换行数据

在parse方法的配置中添加map函数,手动将CSV中的嵌套字段映射到Vehicle类的owner对象:

const stream = fs.createReadStream('/path/to/file.csv');
const entities = await this.csvParser.parse(
  stream,
  Vehicle,
  undefined,
  undefined,
  {
    separator: ';',
    map: (row) => ({
      id: row.id,
      brand: row.brand,
      owner: {
        id: row['owner.id'],
        name: row['owner.name']
      }
    })
  }
);

方法2:结合装饰器配置字段映射

使用@CsvField装饰器指定CSV列与类属性的对应关系,再通过Getter方法组合出嵌套对象:

import { CsvField } from 'nest-csv-parser';

export class Vehicle {
  @CsvField()
  id: string;

  @CsvField()
  brand: string;

  @CsvField({ name: 'owner.id' })
  private ownerId: string;

  @CsvField({ name: 'owner.name' })
  private ownerName: string;

  get owner(): Owner {
    return {
      id: this.ownerId,
      name: this.ownerName
    };
  }
}

export class Owner {
  id: string;
  name: string;
}

配置完成后,保持原解析代码即可,解析后通过vehicle.owner获取嵌套对象。

方法3:自定义转换器函数

如果需要更复杂的逻辑,可单独定义转换函数处理每行数据:

const transformRow = (row: any): Vehicle => {
  const vehicle = new Vehicle();
  vehicle.id = row.id;
  vehicle.brand = row.brand;
  vehicle.owner = new Owner();
  vehicle.owner.id = row['owner.id'];
  vehicle.owner.name = row['owner.name'];
  return vehicle;
};

const stream = fs.createReadStream('/path/to/file.csv');
const entities = await this.csvParser.parse(
  stream,
  Vehicle,
  undefined,
  undefined,
  {
    separator: ';',
    map: transformRow
  }
);

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 06:00:46