如何使用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
相关产品推荐
相关产品推荐

