C# CsvHelper:没有为类型映射成员
我用 我有一个嵌套的类,定义如下:C# CsvHelper:没有为类型映射成员,c#,csvhelper,C#,Csvhelper,我用 我有一个嵌套的类,定义如下: private class CsvLine { public string Solution; public string Project; public string DependsOnProject; public string Weight; public string DependsOnPackage; public string PackageVersion; } 我要使用CsvHelper解析的.c
private class CsvLine {
public string Solution;
public string Project;
public string DependsOnProject;
public string Weight;
public string DependsOnPackage;
public string PackageVersion;
}
我要使用CsvHelper
解析的.csv文件具有以下字段名:
解决方案,项目,DependsOn项目,重量,DependsOn包装,包装版本
这是我的密码:
TextReader readFile = new StreamReader(dependenciesCsvFilePath);
var csvReader = new CsvReader(readFile);
IEnumerable<CsvLine> records = csvReader.GetRecords<CsvLine>();
编辑:已解决!和答案相互补充。您需要在对象模型中使用属性而不是字段,默认情况下,它将映射匹配的公共成员
public class CsvLine {
public string Solution { get; set; }
public string Project { get; set; }
public string DependsOnProject { get; set; }
public string Weight { get; set; }
public string DependsOnPackage { get; set; }
public string PackageVersion { get; set; }
}
您还应该阅读有关将类映射到csv文件的内容
Nkosi解释说,默认情况下,CsvHelper映射到属性 我以前在调试器中遇到过
枚举未产生任何结果
消息。这个信息具有误导性。即使调试器说没有记录,也有记录。您可以使用foreach
迭代IEnumerable,或调用IEnumerable上的.ToArray()
或.ToList()
加载所有记录,例如:
var records = csvReader.GetRecords<CsvLine>();
foreach(var record in records)
{
...
}
请小心,因为这将执行IEnumerable并返回所有结果
您可以在其他可能的原因中找到这一点和其他技巧:
- 标题字符串引号字符
- 分隔符字符
var conf = new CsvHelper.Configuration.Configuration();
conf.Delimiter = ",";
conf.Quote = '\'';
var csv = new CsvHelper.CsvReader(reader, conf);
var rows = csv.GetReads<MyClass>();
var conf=new CsvHelper.Configuration.Configuration();
conf.Delimiter=“,”;
配置引号=“\”;
var csv=新的CsvHelper.CsvReader(读卡器,conf);
var rows=csv.GetReads();
这个问题有一个更简单的解决方案,它只有一行代码。你必须告诉csvhelper查看你的字段
using (var csv = new CsvWriter(writer))
{
csv.Configuration.MemberTypes = CsvHelper.Configuration.MemberTypes.Fields;
.....
}
从CsvHelper 12.2.2开始,我必须这样做才能使其正常工作
csv.Read()
csv.ReadHeader()
csv.GetRecords<T>().ToList();
csv.Read()
csv.ReadHeader()
csv.GetRecords().ToList();
出于某种原因,尽管CsvReader提供了文档,但添加Read()和ReadHeader()方法将使其实际从csv文件中提取数据。取消嵌套时出现相同错误?字段与属性。文件中的头在哪里?如果没有标题,则必须通过indexUse.GetRecords().ToArray()
创建一个类映射来映射,以首先加载数据,然后检查它们。我看到调试器抱怨枚举为空,即使有记录。顺便问一下,您使用的是哪个版本的CsvHelper?它几乎每天都会更改版本week@PanagiotisKanavos调用ToArray()成功了。非常感谢。谢谢你的回复!我按照你的建议做了改变;然而,现在它说,记录
是一个空集合:“枚举没有产生任何结果”。我的.csv文件中肯定存在数据,因此集合不应为空。我的症状与@my_g相同,并通过将所有属性上的私有setter更改为公共setter解决了此问题。自2020年1月起,类映射链接未找到404
。请转到这里:@LeonardAB我修复了链接。谢谢你的提醒。Mind@robin qiu answerI遇到了同样的问题,即使在添加了一个类地图之后。定界符也与本案有关!
var conf = new CsvHelper.Configuration.Configuration();
conf.Delimiter = ",";
conf.Quote = '\'';
var csv = new CsvHelper.CsvReader(reader, conf);
var rows = csv.GetReads<MyClass>();
using (var csv = new CsvWriter(writer))
{
csv.Configuration.MemberTypes = CsvHelper.Configuration.MemberTypes.Fields;
.....
}
csv.Read()
csv.ReadHeader()
csv.GetRecords<T>().ToList();