【问题标题】:FileHelpers library - Is it possible to change field's date format at runtime?FileHelpers 库 - 是否可以在运行时更改字段的日期格式?
【发布时间】:2015-06-11 21:49:17
【问题描述】:

使用 FileHelpers 库版本 3.0.1。

假设您定义了一个从 csv 文件导入的字段,如下所示:

    [FieldTrim(TrimMode.Both)] 
    [FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
    [FieldConverter(ConverterKind.Date, "d-MMMM-yyyy")]
    public DateTime DOB;

现在,csv 字段应采用日期格式“d-MMMM-yyyy”,并在编译时设置。我在运行时要求(有时)将此格式更改为“d-MMMM-yy”。

使用的格式取决于源文件 - 一些文件有 2 位数年份,其他文件有 4 位数年份。我会在程序启动时知道使用哪种格式。

这可以通过 FileHelpers 实现吗?我想我可以添加一个字符串列,例如:

[FieldTrim(TrimMode.Both)] 
[FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
public string DOBAsString; 

,并让FileHelpers将数据读入该字段,并自己循环转换为DOB字段。有没有更清洁的方法?

【问题讨论】:

  • 您可以在运行时更改 FieldConverter 属性的值。你可以在这里看到一个例子codinglight.blogspot.in/2008/10/…
  • 谢谢,但我不确定这是否适用于 FileHelpers,因为 FileHelpers 负责创建字段所在对象的实例。所以似乎没有钩子可以获取对象的实例(?)。
  • 我明白了。如果您找不到使用 FileHelpers 解决此问题的方法,您仍然可以在运行时更改属性(即使 FileHelpers 创建了实例)。您可以将此解决方案作为最后的手段。

标签: c# filehelpers


【解决方案1】:

最简单的方法是使用ConverterKind.DateMultiFormat 而不是ConverterKind.Date

[FieldTrim(TrimMode.Both)] 
[FieldQuoted('"', QuoteMode.OptionalForBoth, MultilineMode.NotAllow)]
[FieldConverter(ConverterKind.DateMultiFormat, "d-MMMM-yyyy", "d-MMMM-yy"]
public DateTime DOB;

通常,在运行时指定格式的另一种方法是将runtime classes 与 ClassBuilder 一起使用:

FixedClassBuilder cb = new FixedLengthClassBuilder("Customers"); 

cb.AddField("DOB", 8, typeof(DateTime)); 
cb.LastField.Converter.Kind = ConverterKind.Date; 
cb.LastField.Converter.Arg1 = "d-MMMM-yyyy"; // or whatever
cb.LastField.TrimMode = TrimMode.Both; 
cb.LastField.FieldNullValue = DateTime.Now;          

engine = new FileHelperEngine(cb.CreateRecordClass()); 

【讨论】:

    猜你喜欢
    • 2019-04-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多