我有一个带有字段标题的CSV文件,其中一些包含两个或三个用空格分隔的单词:
您可以在上面的图片中看到包含空格的字段标题:
"Time of Day","Process Name"和"Image Path".
当我尝试通过调用读取CSV reader.GetRecords<DataRecord>();
(DataRecord
我已定义的类在哪里)时,我收到错误:
CSV文件中不存在字段'TimeOfDay'."*
这是因为我的DataRecord
类不能包含带空格的成员.
如何使用CsvHelper解析CSV文件?
use*_*830 29
基于CsvHelper 文档,有几种方法可以实现我们期望的结果.
1.忽略标题中的空白区域 (我相信它可以轻松解决您的问题)
在CsvHelper 3或更高版本中,使用PrepareHeaderForMatch
(记录在http://joshclose.github.io/CsvHelper/configuration#headers)从标头中删除空格:
csv.Configuration.PrepareHeaderForMatch =
header => Regex.Replace(header, @"\s", string.Empty)
Run Code Online (Sandbox Code Playgroud)
在CsvHelper 2中,设置IgnoreHeaderWhiteSpace
标志,告诉读者在按名称将列与属性匹配时忽略标题中的空格.
reader.Configuration.IgnoreHeaderWhiteSpace = true;
Run Code Online (Sandbox Code Playgroud)
2.手动阅读
我们可以手动读取每个字段,如:
var reader = new CsvReader(sr);
do
{
reader.Read();
var record=new DataRecord();
record.TimeOfDay=reader.GetField<string>("Time of Day");
record.ProcessName=reader.GetField<string>("Process Name");
record.PID=reader.GetField<string>("PID");
record.Operation=reader.GetField<string>("Operation");
record.Path=reader.GetField<string>("Path");
record.Result=reader.GetField<string>("Result");
record.Detail=reader.GetField<string>("Detail");
record.ImagePath=reader.GetField<string>("Image Path");
} while (!reader.IsRecordEmpty());
Run Code Online (Sandbox Code Playgroud)
3.类映射:
我们可以使用以下方法手动映射我们班级的属性和CSV文件中的标题name class mapping
:
public sealed class DataRecordMap:CsvClassMap<DataRecord>
{
public DataRecordMap()
{
Map( m => m.TimeOfDay).Name("Time Of Day");
Map( m => m.ProcessName).Name("Process Name");
Map( m => m.PID).Name("PID");
Map( m => m.Operation).Name("Operation");
Map( m => m.Path).Name("Path");
Map( m => m.Result).Name("Result");
Map( m => m.Detail).Name("Detail");
Map( m => m.ImagePath).Name("Image Path");
}
}
Run Code Online (Sandbox Code Playgroud)
那我们应该使用以下方式注册:
reader.Configuration.RegisterClassMap<DataRecordMap>();
Run Code Online (Sandbox Code Playgroud)
public class DataRecord
{
[Name("Time of Day")]
public string TimeOfDay { get; set; }
[Name("Process Name")]
public string ProcessName { get; set; }
public string PID { get; set; }
public string Operation { get; set; }
public string Path { get; set; }
public string Result { get; set; }
public string Detail { get; set; }
[Name("Image Path")]
public string ImagePath { get; set; }
public static IEnumerable<DataRecord> ParseDataRecords(Stream file)
{
using (var sr = new StreamReader(file))
using (var csv = new CsvReader(sr))
{
foreach (var record in csv.GetRecords<DataRecord>())
{
yield return record;
}
}
}
}
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
8576 次 |
最近记录: |