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

当您将文件(如示例中)读入 a 时DataTable,这是获取数据值的一种方式。您不能使用Job[],因为引擎不是基于Job,而是基于dynamicallyCreatedRecordClass.GetType()

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