我使用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's和Panagiotis'答案相互补充。
答案 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文件。
答案 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并返回所有结果。
中找到这个和其他技巧答案 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文件中提取数据。