Я борюсь с чем-то, что, я не уверен, связано с ошибкой или неполной настройкой и свойствами объекта.
Я использую 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 — это отличный актив, поэтому я бы предпочел придерживаться этого подхода, если можно будет найти ответ.