【问题标题】:Parsing positional record file with n-level hierarchy using FileHelper library使用 FileHelper 库解析具有 n 级层次结构的位置记录文件
【发布时间】:2012-03-28 14:46:03
【问题描述】:

我正在尝试使用 FileHelper 库来解析文本文件。最终数据将存储在数据库中。我的文本文件包含位置记录。记录的前两个字符定义了记录层次结构中的位置。 该文件按以下方式排序:

  • 10个通用数据(10-19个都同级)
    • 20 2级数据(20-29级同级)
      • 30个3级数据(30-39级同级)
        • 40 4 级数据
          • 50 5 级数据
            • 60 最后一级数据
            • 60 最后一级数据
          • 50 5 级数据
            • 60 最后一级数据
            • 60 最后一级数据
        • 40 4 级数据
          • 50 5 级数据
            • 60 最后一级数据
            • 60 最后一级数据
          • 50 5 级数据
            • 60 最后一级数据
            • 60 最后一级数据
      • 30 3 级数据
        • 40、50、60..的重复序列
    • 20 二级数据
      • 20、40、50、60..等的重复序列……

现在我正在尝试使用 FileHelper 的 Master-Detail 概念,但我想它只适用于 Master-Detail 的一个级别。它可以用来创建数据层次结构,然后可以用来填充相关表吗?所有的记录都是固定长度的记录,所以没有问题。

注意:记录之间没有主外键关系。位置和记录号告诉谁是父母(主人),谁是孩子(详情)。

样品日期如下:

10R 420120320F 20120320212045 16
11F FFuture              
11C OCall                
11P OPut                 
12CADCanadian Dollars     0
12CHFSwiss Francs         0
12CZKCzech Republic Korun 0
12DEMGerman Marks         0
12DKKDanish Krone         0
12ESBSpanish Pesatas      3
12EUREuropean currency Un 0
12FIMFinnish Mark         0
14     1 20.0000    100 2O  UKX 1A 1L  Z   1B 1
14     2 20.0000    100 2L  EFE 1A 1O  EFE 1B 1
14     3 20.0000    100 2L  EFP 1A 1O  EFP 1B 1
14     4 20.0000    100 2L  CCI 1A 1O  CCI 1B 1
14     5 20.0000    100 2L  AXI 1A 1O  AXI 1B 1
14     6 20.0000    100 2L  BLI 1A 1O  BLI 1B 1
15  1F+0, VOL+        2
15  2F+0, VOL-        1
15  3F+1/3, VOL+      4
15  4F+1/3, VOL-      3
15  5F-1/3, VOL+      6
15 16F-EXTREME       16
16EQYLIFFE Equities           
16IPEIntl. Petroleum Exchange 
16LCPLIFFE Commodity Products 
16LIFLIFFE Financials         
16LIGLIFFE OTC                
16LMELME Metals               
20L  LIFFE   F 
30AXIAEX Index              EQYEUR2.000.3500        10 110 1        
31 1 10000000099999999
32  1       220 2 1 1A 1 1B
34 1 1 1 1
40ZAXFAEX Index Future    EUR 10000    10       0.02000    1.00     0     0 2000002
50201204000.0000000.25000.2500  120120400
60       0F     1 3308420   1.0000      0      0 -66667 -66667  66667  66667-133333-133333 133333 133333-200000-200000 200000 200000-140000 140000
50201205000.0000000.25000.2500  120120500
60       0F     1 3262910   1.0000      0      0 -66667 -66667  66667  66667-133333-133333 133333 133333-200000-200000 200000 200000-140000 140000
50201206000.0000000.25000.2500  120120600
60       0F     1 3258970   1.0000      0      0 -66667 -66667  66667  66667-133333-133333 133333 133333-200000-200000 200000 200000-140000 140000
40I  OTHREE MONTH EURO (EUEUR 10000    25       0.25000    1.00     3  1000   32002
50201204000.0000000.35000.3500  120120600
60   97750C     1   16000   1.0000      0      0  -1067  -1067   1067   1067  -2133  -2133   2133   2133  -3200  -3200   3200   3200  -2240   2240
60   97750P     1       0   0.0000      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0
60   97875C     1   14750   1.0000      0      0  -1067  -1067   1067   1067  -2133  -2133   2133   2133  -3200  -3200   3200   3200  -2240   2240
60   97875P     1       0   0.0000      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0      0
30L  3 Month Pound Sterli   LIFGBP2.000.3500         11010 1        
31 6 10000000020120600 22012090020121200 32013030020131200 42014030020141200 52015030020151200 62016030099999999
32  1        50 2 2 1A 2 1B
32  2        55 2 1 1A 1 1B
32 21       290 2 6 1A 6 1B
34 2 1 1 3 2 4 6

请任何人都可以指导我如何使用 FileHelper 或任何其他库或某种算法来解析它。在这种情况下使用 XML 可能是一个问题,因为文件大小很大(100 Mb),所以我更喜欢基于非 xml 的方法(我以前的方法是基于 XML 的,但被我的架构师拒绝了)。

提前致谢。

【问题讨论】:

    标签: c# .net algorithm parsing filehelpers


    【解决方案1】:

    FileHelpers 并不是真正为复杂的格式设计的。如果您为每一行定义一个单独的格式并根据行首解析它们,您可能会得到 MultiRecord engine 的某个位置,但您会发现将子记录与父记录链接起来很棘手。

    我认为您最好的方法是手动编写代码。类似的东西

    1. 逐行读取
    2. 将每一行分成多个字段
    3. 如果是主行,请阅读详细行
    4. 如果详细信息行是母版以了解更多详细信息,请阅读这些行...等等。

    如果文件很大,那么你不应该尝试处理整个而不将解析的部分保存在某个地方(数据库)。

    有一些有趣的方法可以处理 CSV 语法的解析。您可以使用Linq,当出现解析问题时,它往往不会提供非常有用的错误消息。或者您可以按照here 的描述使用 ExpandoObjects。另一种方法是使用像Sprache 这样的解析器生成器。无论如何,如果您尝试处理整个文件,这些方法可能会遇到内存问题。我的建议是考虑使用它们来解析各个行。

    【讨论】:

    • 感谢您的确认。在文件助手(多记录引擎)上花了两天时间后,我发现了这一点。所以我正在关注你提到的类似的东西。 1. 逐行读取 2. 创建对象层次结构(每个记录类型一个类) 3. 让解析行中字段的责任由单个类承担。 4.(由每个类)实现某种接口,用于将其字段保存在数据库中,然后自行处理。 5. 只需在子节点保存之前检查父节点是否保存,但在其所有子节点完成保存后进行处置。
    【解决方案2】:
    1. 方法你可以使用正则表达式解析文件这是一个大体思路

    2. 分裂并获胜

      2.1。分行

      2.2。用单词拆分行。关于 n 个单词,你知道你期望什么格式

      2.3。如果 2.2 还不够,请为 line 应用正则表达式来获取数据。

      2.4。如果 2.3 还不够,也许你有区域、标题、财务信息 1、财务信息 2,使用 2.1 和 2.2 知道你在哪里,并保存你的状态,使用这个状态来应用你需要的规则。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-07-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-03-01
      • 2013-03-18
      • 1970-01-01
      相关资源
      最近更新 更多