Пробелы без кавычек с использованием DelimitedClassBuilder с FileHelpers

Я борюсь с чем-то, что, я не уверен, связано с ошибкой или неполной настройкой и свойствами объекта.

Я использую FileHelpers для обработки файла CSV.

Если я использую встроенные атрибуты для обработки данных, как показано ниже, все в порядке;

[IgnoreFirst(1)]
[IgnoreEmptyLines()]
[DelimitedRecord(",")]
public class Job
{
    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.AllowForBoth)]
    public string WM_Identifier;
    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.AllowForBoth)]
    public string JobDesription;
    [FieldConverter(ConverterKind.Date, "dd/MM/yyyy HH:mm:ss")]
    public DateTime? Job_Start_Date_Time;
    [FieldConverter(ConverterKind.Date, "dd/MM/yyyy HH:mm:ss")]
    public DateTime? Job_End_Date_Time;
}

обработано с

        FileHelperEngine<Job> engine = new FileHelperEngine<Job>();
        engine.ErrorManager.ErrorMode = ErrorMode.ThrowException;
        engine.SetProgressHandler(ProgressChangeHandler, ProgressMode.NotifyRecords);

        _parsedJobs = engine.ReadFile(dlgOpen.FileName) as Job[];

Вот образец данных;

"OGEA03181733", новая сборка, 11.05.2012 13:00:00, 11.05.2012 17:00:00

Однако формат даты неизвестен до времени выполнения (** я жестко закодировал формат в коде ниже для иллюстративных целей), поэтому я использовал DelimitedClassBuilder следующим образом

public class Job
{
    public string WM_Identifier;
    public string JobDesription;
    public DateTime? Job_Start_Date_Time;
    public DateTime? Job_End_Date_Time;
}

        DelimitedClassBuilder cb = new DelimitedClassBuilder("Job", ",");
        cb.IgnoreEmptyLines = true;
        cb.IgnoreFirstLines = 1;

        string[] ClassBuilderFields1 = {"WM_Identifier","JobDescription"};
        foreach (string myFieldName in ClassBuilderFields1)
        {
            cb.AddField(myFieldName, typeof(String));
            cb.LastField.QuoteMode = QuoteMode.OptionalForBoth;
            cb.LastField.QuoteMultiline = MultilineMode.AllowForBoth;
        }

        string dataDateFormat = "dd/MM/yyyy"; //**
        string dataTimeFormat = "HH:mm:ss"; //**

        string[] variableDateTimeFields = { "Job_Start_Date_Time", "Job_End_Date_Time"};

        foreach (string myFieldName in variableDateTimeFields)
        {
            cb.AddField(myFieldName, typeof(DateTime));
            cb.LastField.FieldNullValue = DateTime.Today;
            cb.LastField.Converter.Kind = ConverterKind.Date;
            cb.LastField.Converter.Arg1 = string.Format("{0} {1}", dataDateFormat, dataTimeFormat);
        }

Когда я сейчас обрабатываю, я получаю следующую ошибку

Разделитель ',' не может быть найден после поля JobDescription в строке 2 (в записи меньше полей, неверный разделитель или следующее поле должно быть помечено как необязательное

Если я помещаю описание задания в кавычки, оно отлично обрабатывается с помощью построителя классов, но данные предоставляются клиентом, поэтому у меня нет контроля (отсюда проблема с форматом даты !!). Я проверил свойства движка в обоих случаях, но не нашел несоответствия. Встроенное решение работает независимо от того, указано ли описание работы в кавычках или нет, но эквивалентная (на мой взгляд) версия построителя классов будет работать только в том случае, если описание работы указано в кавычках.

Спасибо за любую помощь. Я чувствую, что FileHelpers — это отличный актив, поэтому я бы предпочел придерживаться этого подхода, если можно будет найти ответ.


person Istanbul Steve    schedule 01.12.2012    source источник


Ответы (2)


Похоже, проблема в ClassBuilder, я создам тестовый пример и попытаюсь решить проблему, но пока я настоятельно рекомендую вам использовать этот подход:

Прочитайте поля даты как строку, а затем обработайте их во время выполнения в правильном формате:

[IgnoreFirst(1)]
[IgnoreEmptyLines()]
[DelimitedRecord(",")]
public class Job
{
    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.AllowForBoth)]
    public string WM_Identifier;
    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.AllowForBoth)]
    public string JobDesription;

    public string Job_Start_Date_Time;
    public string Job_End_Date_Time;
}

Черс

person Marcos Meli    schedule 03.12.2012

Вам нужно создать класс записи с

Type dynamicallyCreatedRecordClass = cb.CreateRecordClass();

А затем вы создаете (не универсальный) движок с динамически созданным классом.

FileHelperEngine engine = new FileHelperEngine(dynamicallyCreatedRecordClass);

Когда вы читаете файл (как в примерах) в DataTable, это один из способов получения значений данных. Вы не можете использовать Job[], потому что движок основан не на Job, а на dynamicallyCreatedRecordClass.GetType().

DataTable _parsedJobs = engine.ReadFileAsDT(dlgOpen.FileName);
person shamp00    schedule 03.12.2012
comment
ReadFileAsDT устарело для версии 3.2 - person Kiquenet; 07.03.2018