如何创建C#映射类以使用CsvHelper

26
我有一个包含40列的csv文件,我想使用csvhelper将其加载到datatable中。 安装了这个库之后,我做了以下操作:
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>();
    }
}

1
难道不就在文档中吗?http://joshclose.github.io/CsvHelper/#mapping - Kirk Woll
如果你的“更新2”编辑是适合你的工作解决方案,最好将其发布为问题的答案。对于需要你的解决方案并寻找你的问题的人来说,这会更清晰和容易。 - Frédéric
5
文档没有说明您需要在映射部分注册类映射,我怀疑如果文档更清晰,操作者就不需要询问了。 - reggaeguitar
3
2020年更新:根据这个问题 ,目前的语法是使用ClassMap<T>而不是CsvClassMap。还需要添加using CvsHelper.Configuration; - user8675309
刚刚遇到了同样的问题,使用Update 2中的代码,将CsvClassMap替换为ClassMap即可正常工作。 - Lia
显示剩余5条评论
2个回答

6
似乎你只需为CSVFileDefinition类中预期在CSV文件中找到的每个列名添加一个属性,自动映射就会处理其余部分。
例如,如果属性名称与CSV中的列名匹配,则此代码将提取农场ID列:
public class CSVFileDefinition
{
    public int FarmId { get; set; }

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

3
我收到了这个异常信息:“CSV文件中不存在'FRM_ID'字段。” - Agnieszka Polec
2
我已经成功地使用了这种方法,但当属性不是字符串且数据单元格为空时,出现了问题。例如,我有一个十进制属性,但它无法工作。 - Vasily Hall
当属性名称与列标题不同时,请使用类映射,就像问题中添加的更新一样。 - hatem87

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/


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接