如何创建到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>();
}
}
似乎您所需要做的就是为您希望在CSV文件中找到的每个列名向CSVFileDefinition类添加一个属性,然后自动映射应该负责其余的工作。
例如,如果属性名与CSV中的列名匹配,则应该拉入农场ID列:
public class CSVFileDefinition
{
public int FarmId { get; set; }
//... add other columns here...
}
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/