CsvHelper:没有为成员映射成员

时间:2017-11-01 15:34:50

标签: c# 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>();

根据文档here,上述代码应该有效。

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

我将CsvLine的可访问性从private更改为public,但这没有任何区别。

我做错了什么?

编辑:我尝试取消嵌套CsvLine课程并将其公开,但这也无济于事。

编辑:我将更改设为Nkosi suggested;但是,现在它说records是一个空集合:&#34;枚举没有产生结果&#34;。我的.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'sPanagiotis'答案相互补充。

5 个答案:

答案 0 :(得分:9)

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

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: Class Mapping

答案 1 :(得分:6)

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 format specifier强制调试器在Watch,Quick Watch或Immediate窗口中显示IEnumerable中的所有项目,例如:

records,results

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

你可以在7 Hidden Gems in Visual Studio 2017

中找到这个和其他技巧

答案 2 :(得分:1)

其他可能的原因:

  • 标题字符串引用字符。
  • 定界符。

用于配置它们的示例代码:

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

答案 3 :(得分:1)

有一个更简单的解决方案,只需一行代码。您必须告诉csvhelper查看您的字段。

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

答案 4 :(得分:0)

从CsvHelper 12.2.2开始,这是我必须要做的,才能使其正常工作

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

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