1

バグまたは不完全なオブジェクトのセットアップとプロパティが原因かどうかわからない問題に取り組んでいます。

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 は優れた資産であると感じているので、答えが見つかった場合はこのアプローチを維持したいと考えています。

4

2 に答える 2

0

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

チャーズ

于 2012-12-03T15:04:53.617 に答える
0

でレコードクラスを作成する必要があります

Type dynamicallyCreatedRecordClass = cb.CreateRecordClass();

次に、動的に作成されたクラスを使用して (非汎用) エンジンを作成します。

FileHelperEngine engine = new FileHelperEngine(dynamicallyCreatedRecordClass);

ファイルを (例のように) に読み込むとDataTable、データ値を取得する 1 つの方法になります。エンジンがではJob[]なく に基づいているため、使用できません。JobdynamicallyCreatedRecordClass.GetType()

DataTable _parsedJobs = engine.ReadFileAsDT(dlgOpen.FileName);
于 2012-12-03T15:39:36.990 に答える