使用CsvHelper将CSV中的所有值读入List
所以我一直在读我不应该编写自己的CSV读写器,所以我一直在尝试使用通过nuget安装的CsvHelper库。 CSV文件是灰度图像,行数是图像高度,数字列是宽度。 我想将行逐行读入单个List
或List
。
我到目前为止的代码是:
using CsvHelper; public static List ReadInCSV(string absolutePath) { IEnumerable allValues; using (TextReader fileReader = File.OpenText(absolutePath)) { var csv = new CsvReader(fileReader); csv.Configuration.HasHeaderRecord = false; allValues = csv.GetRecords } return allValues.ToList(); }
但allValues.ToList()
抛出一个:
用户代码未处理CsvConfigurationException
CsvHelper.dll中出现“CsvHelper.Configuration.CsvConfigurationException”类型的exception,但未在用户代码中处理
附加信息:inheritanceIEnumerable的类型无法自动映射。 您是否不小心调用了对单个记录执行操作的GetRecord或WriteRecord,而不是调用作为记录列表的GetRecords或WriteRecords?
GetRecords
可能期望我自己的自定义类,但我只是想将值作为一些原始类型或字符串。 此外,我怀疑整行正在转换为单个字符串,而不是每个值都是一个单独的字符串。
根据@Marc L’的post你可以试试这个:
public static List ReadInCSV(string absolutePath) { List result = new List (); string value; using (TextReader fileReader = File.OpenText(absolutePath)) { var csv = new CsvReader(fileReader); csv.Configuration.HasHeaderRecord = false; while (csv.Read()) { for(int i=0; csv.TryGetField (i, out value); i++) { result.Add(value); } } } return result; }
如果您只需要数组中每行的字符串值,则可以直接使用解析器。
var parser = new CsvParser( textReader ); while( true ) { string[] row = parser.Read(); if( row == null ) { break; } }
http://joshclose.github.io/CsvHelper/#reading-parsing
更新
版本3支持读取和编写IEnumerable属性。
你很亲密 它并不是在尝试将行转换为字符串。 CsvHelper尝试使用标题行中给出的名称将行中的每个字段映射到您为其提供的类型的属性。 此外,它不知道如何使用IEnumerable
类型( string
实现)来执行此操作,因此它只是在自动映射到达测试类型的那一点时抛出。
对于你正在做的事情来说,这是一个很大的复杂因素。 如果您的文件格式足够简单,您的文件格式似乎是 – 众所周知的字段格式,既没有转义也没有引用分隔符 – 我认为没有理由需要承担导入库的开销。 您应该能够根据需要使用System.IO.File.ReadLines()
和String.Split()
枚举值。
//pseudo-code...you don't need CsvHelper for this IEnumerable GetFields(string filepath) { foreach(string row in File.ReadLines(filepath)) { foreach(string field in row.Split(',')) yield return field; } }
请试试这个。 这对我有用。
TextReader reader = File.OpenText(filePath); CsvReader csvFile = new CsvReader(reader); csvFile.Configuration.HasHeaderRecord = true; csvFile.Read(); var records = csvFile.GetRecords().ToList();
服务器是一个实体类。 这就是我创造的方式。
public class Server { private string details_Table0_ProductName; public string Details_Table0_ProductName { get { return details_Table0_ProductName; } set { this.details_Table0_ProductName = value; } } private string details_Table0_Version; public string Details_Table0_Version { get { return details_Table0_Version; } set { this.details_Table0_Version = value; } } }