我有一个包含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>();
}
}
2条答案
按热度按时间jvlzgdj91#
看起来,您所需要做的就是为您希望在CSV文件中找到的每个列名向CSVFileDefinition类添加一个属性,自动Map应该会处理其余的事情。
例如,如果属性名称与CSV中的列名匹配,则应拉入场ID列:
hgc7kmma2#
CsvHelper API就像天气一样:如果你不喜欢它,等待五分钟,它会改变:-)
版本20.0.0将
RegisterClassMap
从Configuration
对象移动到Context
对象,该对象是writer本身的一部分:我不相信你能把它附加到一个一般的配置。检查更新日志总是明智的;它会调用破坏性的更改(这非常非常常见)。
参考号:https://joshclose.github.io/CsvHelper/change-log/