如何创建 C# 到 csvhelper 的映射类

问题描述 投票:0回答:2

我有一个包含 40 列的 csv 文件,我想使用 csvhelper 将其加载到数据表中。 安装库后,我这样做了:

using (TextReader reader = File.OpenText(fileName)) {
   var csv = new CsvReader(reader);
   while (csv.Read()) {
       var farmID = csv.GetField(0);
       Console.WriteLine(farmID);
   }
}

正如你所看到的,我有一个控制台语句,它工作得很好。

但是,csvReader 有一个构造函数,它采用自定义类将数据直接加载到其中。

我试过这个:

var record = csv.GetRecord<CSVFileDefinition>();

但我遇到了这个例外

No properties are mapped for type 'MyProjectName.CSVFileDefinition'.

因为 CSVFileDefinition 是一个空类。

我的问题是如何填补该课程。

这是图书馆:

http://joshclose.github.io/CsvHelper/

非常感谢

更新2

对我有用的解决方案是:
sealed class CSVFileDefinitionMap : CsvClassMap<CSVFileDefinition>
{
   public CSVFileDefinitionMap()
   {
      Map(m => m.FRM_ID).Name("FARM ID");
      Map(m => m.FRM_OWNER).Name("FARM OWNER ");
   }
}

class CSVFileDefinition
{
    public string FRM_ID { get; set; }
    public string FRM_OWNER { get; set; }
}

using (TextReader reader = File.OpenText(fileName)) {
    var csv = new CsvReader(reader);
    csv.Context.RegisterClassMap<CSVFileDefinitionMap>();
    while (csv.Read()) {
       var record = csv.GetRecord<CSVFileDefinition>();
    }
}
c# .net csv csvhelper
2个回答
6
投票

您所需要做的似乎就是为您希望在 CSV 文件中找到的每个列名称添加一个属性到 CSVFileDefinition 类,自动映射应该处理其余的事情。

例如,如果属性名称与 CSV 中的列名称匹配,则应提取场 ID 列:

public class CSVFileDefinition
{
    public int FarmId { get; set; }

    //... add other columns here...
}

4
投票

CsvHelper API 就像天气:如果您不喜欢它,请等待五分钟,它就会改变:-)

版本 20.0.0 将

RegisterClassMap
Configuration
对象移动到
Context
对象,该对象是编写器本身的一部分:我不相信您可以将其附加到通用配置。

// Note: CsvConfiguration takes CultureInfo starting in (I think) v23.0.0
var Config = new CsvConfiguration(CultureInfo.InvariantCulture)
{
    HasHeaderRecord = true,
    Delimiter = ","
};

var outputStream = new StreamWriter("myfile.csv");
var Writer = new CsvWriter(outputStream, Config);

Writer.Context.RegisterClassMap<MyType>(mymap);  // 20.0.0

检查变更日志总是明智的;它指出了重大变化(这是非常非常常见的)。

参考:https://joshclose.github.io/CsvHelper/change-log/

© www.soinside.com 2019 - 2024. All rights reserved.