CsvHelper:没有为类型映射任何成员



我使用CsvHelper 4.0.3。

我有一个嵌套类,定义如下:

private class CsvLine {
public string Solution;
public string Project;
public string DependsOnProject;
public string Weight;
public string DependsOnPackage;
public string PackageVersion;
}

我想使用CsvHelper解析的.csv文件有以下字段名:

Solution,Project,DependsOnProject,Weight,DependsOnPackage,PackageVersion

这是我的代码:

TextReader readFile = new StreamReader(dependenciesCsvFilePath);
var csvReader = new CsvReader(readFile);
IEnumerable<CsvLine> records = csvReader.GetRecords<CsvLine>();

根据这里的文档,上面的代码应该可以工作。

但是,当我检查records时,我会看到消息No members are mapped for type 'ParentClass+CsvLine'

我把CsvLine的可达性从private改为public,但没有什么区别。

我做错了什么?

EDIT:我尝试过取消嵌套CsvLine类并将其公开,但这也没有帮助。

编辑:我按照Nkosi的建议进行了更改;然而,现在它说records是一个空集合:"枚举没有结果"。我的.csv文件中肯定有数据,所以集合不应该是空的。

以下是一些示例数据:

Solution,Project,DependsOnProject,Weight,DependsOnPackage,PackageVersion
FOD.sln,ABC.DEF,IMS.ABC,1,,
FOD.sln,ABC.DEF,IMS.DEF,1,,
FOD.sln,ABC.DEF,IMS.GHI,1,,
FOD.sln,ABC.DEF,IMS.JKL,1,,

编辑:已解决!Nkosi和Panagiotis的回答是相辅相成的。

您需要使用Properties而不是对象模型中的字段,因为默认情况下,它会映射匹配的公共成员

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文件。

CsvHelper:类映射

Nkosi解释说CsvHelper默认映射到属性。

我以前在调试器中遇到过Enumeration yielded no results消息。这条信息具有误导性。有记录,即使调试器说没有。您使用foreach迭代IEnumerable,或者在其上调用.ToArray().ToList()来加载所有记录,例如:

var records = csvReader.GetRecords<CsvLine>();
foreach(var record in records)
{
...
}

var records = csvReader.GetRecords<CsvLine>().ToArray();

通过添加results格式说明符,您可以强制调试器在"监视"、"快速监视"或"立即"窗口中显示IEnumerable中的所有项,例如:

records,results

请小心,因为这将执行IEnumerable并返回所有结果。

你可以在Visual Studio 2017 中的7颗隐藏的宝石中找到这个和其他技巧

这个问题有一个更简单的解决方案,它只需要一行代码。你必须告诉csvhelper查看你的字段。

using (var csv = new CsvWriter(writer))
{
csv.Configuration.MemberTypes = CsvHelper.Configuration.MemberTypes.Fields;
.....
}

其他可能的原因:

  • 标题字符串引号字符
  • 分隔符字符

配置它们的示例代码:

var conf = new CsvHelper.Configuration.Configuration();
conf.Delimiter = ",";
conf.Quote = ''';
var csv = new CsvHelper.CsvReader(reader, conf);
var rows = csv.GetReads<MyClass>();

从CsvHelper 12.2.2开始,这就是我必须做的,以使其能够在中工作

csv.Read() 
csv.ReadHeader()
csv.GetRecords<T>().ToList();

出于某种原因,尽管CsvReader有文档,但添加Read()和ReadHeader()方法将使其能够实际从csv文件中提取数据。

最新更新