有没有一种简单的方法可以将 CSV 文件中记录的行号映射到 POCO?

Posted

技术标签:

【中文标题】有没有一种简单的方法可以将 CSV 文件中记录的行号映射到 POCO?【英文标题】:Is there a simple way to map the row number of the record in the CSV file to a POCO? 【发布时间】:2021-09-25 03:58:16 【问题描述】:

我有一个流程,可以导入许多具有不同定义的 CSV 文件,并根据各种逻辑将它们转换为相应数量的离散 POCO 类型。为了更好的排查问题,我现在需要自己在POCO上记录行号。因此,我为我的所有 POCO 创建了一个基类,并使用一个属性来处理这个问题。

根据this discussion,可以通过构造ClassMap 将CSV 文件记录的行/行号映射到POCO。但是,我目前正在使用应用于我的 POCO 中每个属性的IndexAttribute 来执行映射。由于我有许多 POCO,并且映射目前运行良好,我宁愿不必为每个 POCO 创建ClassMaps(不仅维护起来更复杂且 IMO 更棘手,而且还需要更多努力)。

是否有一个简单的替代方案,最好使用属性来实现行/行号 => POCO 属性映射?我查看了 CSVHelper 存储库中的属性,但没有看到任何相关的内容。

【问题讨论】:

您是否考虑过具有行索引的 poco 的基类? 【参考方案1】:

您可以使用TypeConverter 属性。

void Main()

    var config = new CsvConfiguration(CultureInfo.InvariantCulture)
    
        HasHeaderRecord = false,
        MissingFieldFound = null
    ;
    
    using (var reader = new StringReader("1,One\n2,Two"))
    using (var csv = new CsvReader(reader, config))
    
        var records = csv.GetRecords<Foo>().Dump();
    


public class Foo 

    [Index(0)]
    public int Id  get; set; 
    [Index(1)]
    public string Name  get; set; 
    [TypeConverter(typeof(RowNumberConverter))]
    public int RowNumber  get; set; 


public class RowNumberConverter : DefaultTypeConverter

    public override object ConvertFromString(string text, IReaderRow row, MemberMapData memberMapData)
    
        return row.Context.Parser.Row;
    

【讨论】:

以上是关于有没有一种简单的方法可以将 CSV 文件中记录的行号映射到 POCO?的主要内容,如果未能解决你的问题,请参考以下文章

以编程方式将 CSV 数据导入 Access

有没有一种简单的方法可以将 BigQuery 中的行转换为 JSON?

有没有一种有效的方法可以附加到现有的 csv 文件而不在 R 中重复?

有没有简单的方法将 .xls 文件转换为 .csv 文件? (Excel)

在 GreenPlum 中插入

对没有标题和第一列的csv文件中的行进行排序