Разбор CSV, где заголовки содержат пробелы с CsvHelper

У меня есть CSV-файл с заголовками полей, и некоторые из них содержат два или три слова, разделенные пробелами:

Screenshot of the first few rows of a spreadsheet in a spreadsheet application, including headers that contain spaces, as described above.

вы можете увидеть на приведенном выше рисунке заголовки полей, которые содержат пробелы:
"Время суток", "имя процесса"и" путь изображения".

когда я попытался прочитать CSV, позвонив reader.GetRecords<DataRecord>(); (где DataRecord это класс, который я определил), я получаю ошибку:

поля "TimeOfDay" не существуют в CSV файл."*

Это потому, что мой DataRecord класс не может содержать пробелы.

как я могу использовать CsvHelper для анализа файла CSV?

2 ответов


на основе CsvHelper документация, есть несколько способов, которыми мы можем достичь желаемых результатов.

1. Игнорировать пробел из заголовков (который я считаю, должен легко решить вашу проблему.)

в CsvHelper 3 или более поздней версии используйте PrepareHeaderForMatch (задокументировано в http://joshclose.github.io/CsvHelper/configuration#headers) чтобы удалить пробелы из заголовков:

csv.Configuration.PrepareHeaderForMatch =
    header => Regex.Replace(header, @"\s", string.Empty)

в CsvHelper 2, комплект the IgnoreHeaderWhiteSpace флаг, который говорит читателю игнорировать пробел в заголовках при сопоставлении столбцов со свойствами по имени.

reader.Configuration.IgnoreHeaderWhiteSpace = true;

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());

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");
     }
}

затем мы должны зарегистрировать его использование:

reader.Configuration.RegisterClassMap<DataRecordMap>();

вы должны создать отображение,http://joshclose.github.io/CsvHelper/mapping.