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();