我使用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;
}
Run Code Online (Sandbox Code Playgroud)
我想要解析的.csv文件CsvHelper具有以下字段名称:
Solution,Project,DependsOnProject,Weight,DependsOnPackage,PackageVersion
这是我的代码:
TextReader readFile = new StreamReader(dependenciesCsvFilePath);
var csvReader = new CsvReader(readFile);
IEnumerable<CsvLine> records = csvReader.GetRecords<CsvLine>();
Run Code Online (Sandbox Code Playgroud)
根据这里的文档,上面的代码应该工作.
但是,当我检查时records,我看到了这个消息No members are mapped for type 'ParentClass+CsvLine'.
我改变的可访问性CsvLine,从private到public,但是这并没有区别.
我做错了什么?
编辑:我已经尝试取消嵌套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,,
Run Code Online (Sandbox Code Playgroud)
编辑:解决了!Nkosi和Panagiotis的答案相互补充.
Nko*_*osi 11
您需要在对象模型中使用"属性"而不是"字段",因为默认情况下,它将映射匹配的公共成员
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; }
}
Run Code Online (Sandbox Code Playgroud)
您还应该阅读将类映射到csv文件.
Nkosi解释说CsvHelper默认映射到属性.
我Enumeration yielded no results在过去的调试器中遇到过这条消息.该消息具有误导性.还有的记录,即使调试器说,有没有.您使用foreach或调用.ToArray()或.ToList()在其上迭代IEnumerable 以加载所有记录,例如:
var records = csvReader.GetRecords<CsvLine>();
foreach(var record in records)
{
...
}
Run Code Online (Sandbox Code Playgroud)
要么
var records = csvReader.GetRecords<CsvLine>().ToArray();
Run Code Online (Sandbox Code Playgroud)
您可以通过添加results 格式说明符强制调试器在Watch,Quick Watch或Immediate窗口中显示IEnumerable中的所有项目,例如:
records,results
Run Code Online (Sandbox Code Playgroud)
要小心,因为这将执行IEnumerable并返回所有结果.
你可以在Visual Studio 2017中的7个隐藏宝石中找到这个和其他技巧
小智 5
这个问题有一个更简单的解决方案,只需一行代码。您必须告诉 csvhelper 查看您的字段。
using (var csv = new CsvWriter(writer))
{
csv.Configuration.MemberTypes = CsvHelper.Configuration.MemberTypes.Fields;
.....
}
Run Code Online (Sandbox Code Playgroud)