我有一个包含 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/
非常感谢
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
检查变更日志总是明智的;它指出了重大变化(这是非常非常常见的)。