使用FileHelper库分析具有n级层次结构的位置记录文件
本文关键字:层次结构 位置 文件 记录 FileHelper 使用 | 更新日期: 2023-09-27 18:29:20
我正在尝试使用FileHelper库来解析文本文件。最终数据将存储在数据库中。我的文本文件包含位置记录。记录的前两个字符定义了记录层次结构中的位置。文件按以下方式排序:
- 10个公共数据(10-19个都具有相同级别)
- 20二级数据(20-29具有相同级别)
- 30三级数据(30-39具有相同级别)
- 40第4级数据
- 50 5级数据
- 60最后一级数据
- 60最后一级数据
- 50 5级数据
- 60最后一级数据
- 60最后一级数据
- 50 5级数据
- 40第4级数据
- 50 5级数据
- 60最后一级数据
- 60最后一级数据
- 50 5级数据
- 60最后一级数据
- 60最后一级数据
- 50 5级数据
- 40第4级数据
- 30三级数据
- 40、50、60的重复序列
- 30三级数据(30-39具有相同级别)
- 20二级数据
- 重复序列20、40、50、60……等等
- 20二级数据(20-29具有相同级别)
现在我正在尝试使用FileHelper的Master-Detail概念,但我想它只适用于一个级别的Master-Datail。它可以用来创建一个数据层次结构,然后用来填充相关的表吗?所有的记录都是固定长度的记录,所以没有问题。
注意:记录之间没有主外键关系。位置和记录编号告诉谁是家长(主),谁是孩子(详细信息)
样品日期如下:
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可能是一个问题,因为文件大小很大(100Mb),所以我更喜欢非基于XML的方法(我以前的方法是基于XML的,但被我的架构师拒绝了)。
提前谢谢。
FileHelpers并不是为如此复杂的格式而设计的。如果您为每一行定义一个单独的格式,并根据行的开头对其进行解析,那么MultiRecord引擎可能会有所帮助,但您会发现将子记录与父记录链接起来很困难。
我认为你最好的方法是手动编码。类似的东西
- 每行读入一行
- 将每行拆分为字段
- 如果是主行,请阅读详细行
- 如果细节行是进一步细节的母版,请阅读这些行。。。等等
如果文件大小很大,那么您不应该试图在不将解析的部分保存在某个地方(数据库)的情况下处理整个文件。
有一些有趣的方法可以处理CSV语法的解析。您可以使用Linq,当出现解析问题时,它不会给出非常有用的错误消息。或者,您可以使用此处所述的ExpandoObjects。另一种方法是使用类似Sprache的解析器生成器。无论如何,如果您试图处理整个文件,这些方法很可能会遇到内存问题。我的建议是在解析单个行时考虑它们。
-
方法您可以使用正则表达式解析文件这是的一个通用概念
-
拆分并赢得
2.1分体式
2.2.把行分成单词。关于n个单词,你知道你期望的格式是什么
2.3.如果2.2还不够,则对行应用正则表达式来获取数据。
2.4.如果2.3还不够,也许你有地区、标题、财务信息1、财务信息2,用2.1和2.2来知道你在哪里,并保存你的状态,用这个状态来应用你需要的规则。