如何创建到csvhelper的C#Map类

mu0hgdu0  于 12个月前  发布在  C#
关注(0)|答案(2)|浏览(117)

我有一个包含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'.

因为CSVFileOption是一个空类。
我的问题是如何填补这一阶层。
这是图书馆:
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>();
    }
}
jvlzgdj9

jvlzgdj91#

看起来,您所需要做的就是为您希望在CSV文件中找到的每个列名向CSVFileDefinition类添加一个属性,自动Map应该会处理其余的事情。
例如,如果属性名称与CSV中的列名匹配,则应拉入场ID列:

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

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

hgc7kmma2#

CsvHelper API就像天气一样:如果你不喜欢它,等待五分钟,它会改变:-)
版本20.0.0将RegisterClassMapConfiguration对象移动到Context对象,该对象是writer本身的一部分:我不相信你能把它附加到一个一般的配置。

// 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/

相关问题