バグまたは不完全なオブジェクトのセットアップとプロパティが原因かどうかわからない問題に取り組んでいます。
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"、新しいビルド、05/11/2012 13:00:00,05/11/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);
}
今処理すると、次のエラーが表示されます
行 2 のフィールド「JobDescription」の後に区切り文字「,」が見つかりません (レコードのフィールドが少ないか、区切り文字が間違っているか、次のフィールドをオプションとしてマークする必要があります
ジョブの説明を引用符で囲むと、クラスビルダーで正常に処理されますが、データは顧客から提供されるため、制御できません (したがって、日付形式の問題!!)。どちらの場合もエンジンのプロパティを確認しましたが、相違点は見つかりませんでした。インライン ソリューションは、ジョブの説明が引用されているか引用されていないかに関係なく機能しますが、同等の (私が見ているように) クラス ビルダー バージョンは、ジョブの説明が引用されている場合にのみ機能します。
助けてくれてありがとう。FileHelpers は優れた資産であると感じているので、答えが見つかった場合はこのアプローチを維持したいと考えています。