固定字段起始位置

Fixed field start position

我刚刚发现了令人惊叹的 FileHelpers 库。 (过去我已经开发了自己的基于属性的 import/export 库)。

我想知道是否存在固定记录为每个字段指定起始字符的可能性。

示例: 输入文件

3232432GIANLUIGI

4234234马里奥

我只想从第 8 个字符导入名称 (Gianluigi)。

我只想读取 CustomerName,没有我必须忽略的文件(尤其是当我们谈论性能时)。

我的真实案例是关于一条记录,它为将来的实施保留了记录位置。

示例:

-从1到100实数字段

-从 101 到 150 无字段 - 为将来实施保留的位置

-从151到160实数字段

-从 161 到 185 另一次没有字段 - 为将来实施保留的位置

-从 186 到 ...N 个实数字段。

我想避免为什么都不读创建假字段(例如从 101 到 150 和从 161 到 185)。

对于我想象的每个 FieldFixedLength 属性的起始位置。

是的,完全是do-able。有几种方法可以做到这一点,我会手动生成:

[FixedLengthRecord(FixedMode.AllowVariableLength)]
public class Customer
{
    [FieldFixedLength(8)]
    [FieldValueDiscarded]
    public int ignoredFieldOne;

    [FieldTrim(TrimMode.Both)]
    [FieldFixedLength(80)]
    public String CustomerName;

    // Skip fields 3 - 5
    // field 3 (length 20) 
    // field 4 (length 5) 
    // field 5 (length 3)
    [FieldFixedLength(28)]
    [FieldValueDiscarded]
    public string ignoredFieldsThreeThroughFive;

    [FieldTrim(TrimMode.Both)]
    [FieldFixedLength(20)]
    public String AnotherField;
}

或者,使用 FileHelpers 附带的 Class 向导可能更容易,您可以在其中 select 内置 class 所需的语言。

  1. 将 class 名称设置为 Customer
  2. Select 定长记录
  3. 根据需要设置FixedMode
  4. 点击下一步
  5. 设置你想要的字段数,例如2
  6. 如果您有 header 行,请将 忽略第一个 设置为 1
  7. 勾选忽略空行
  8. 点击下一步
  9. 在第一个框中,输入 Name 作为 CustomerIDType 作为 int长度作为8
  10. 在第二个框中,输入 CustomerName,保持 Typestring,将 Length 设置为您的最大值(例如,80)和 TrimBoth(或者 Right,如果你想在开头有空格)。

此时,右侧将是您刚刚构建的class。这正是我手动输入的内容,因为我已经知道如何构建这些 classes.

注意 1: FixedMode 设置为 ExactLength 意味着所有记录的长度必须相同

注意 2:class 生成器会自动将您的 class 密封,因此出于性能目的它不会被继承。

注意 3: 对于您不感兴趣的任何职位,您将必须创建一个字段但添加上述属性,它不会填充它(见上文)其中跳过三个字段,因为它们是连续的,但只创建一个字段)