解析标头包含CsvHelper空格的CSV

E23*_*235 19 c# csv csvhelper

我有一个带有字段标题的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)

  • 虽然看起来不错,但方法1似乎不再起作用了。现在,预期功能带有两个参数。添加一个后,似乎返回的值没有被使用,该方法无效。 (2认同)
  • @kjyv我使用`csv.Configuration.PrepareHeaderForMatch =(header,index)=&gt; Regex.Replace(header,@“ \ s”,string.Empty);使它工作。 (2认同)

JPK*_*JPK 7

该库现在支持属性。您可能要使用Name属性。

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)