我使用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:类映射
我以前在调试器中遇到过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文件中提取数据。