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

本文关键字:csvhelper 映射 何创建 创建 | 更新日期: 2023-09-27 18:15:30

我有一个有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>();
    }
}

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

似乎您所需要做的就是为您希望在CSV文件中找到的每个列名向CSVFileDefinition类添加一个属性,然后自动映射应该负责其余的工作。

例如,如果属性名与CSV中的列名匹配,则应该拉入农场ID列:

public class CSVFileDefinition
{
    public int FarmId { get; set; }
    //... add other columns here...
}

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

版本20.0.0将RegisterClassMapConfiguration对象移动到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/