Разбор файла позиционной записи с иерархией n-уровня с использованием библиотеки FileHelper - PullRequest
1 голос
/ 28 марта 2012

Я пытаюсь использовать библиотеку 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 Данные 2-го уровня
      • повторяющаяся последовательность из 20, 40, 50, 60 .. и т. Д. ...

Сейчас я пытаюсь использовать концепцию Master-Detail в FileHelper, но думаю, что она работает только для одного уровня 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 МБ), поэтому я бы предпочел подход, не основанный на XML (мой предыдущий подход был основан на XML и был отклонен моим архитектором).

Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 29 марта 2012

FileHelpers на самом деле не предназначен для сложных форматов. Вы можете получить что-то с MultiRecord engine , если вы определите отдельный формат для каждой строки и проанализируете их все на основе начала строки, но вам будет сложно связать дочерние записи с родительскими записями.

Я думаю, что ваш лучший подход - это кодировать его вручную. Что-то вроде

  1. Читать в строке за строку
  2. Разделить каждую строку на поля
  3. Если это основная линия, прочитайте подробные строки
  4. Если строки подробностей являются основными для дальнейших деталей, прочитайте эти строки ... и т. Д.

Если размер файла большой, вам не следует пытаться обработать целое без сохранения где-то проанализированных частей (базы данных).

Есть несколько интересных подходов для обработки синтаксиса грамматики CSV. Вы можете использовать Linq , который обычно не выдает очень полезные сообщения об ошибках при возникновении проблемы с анализом. Или вы можете использовать ExpandoObjects, как описано здесь . Другой способ - использовать генератор синтаксических анализаторов, например Sprache . Несмотря на это, эти подходы могут привести к проблемам с памятью, если вы попытаетесь обработать весь файл. Мой совет - рассмотреть их для анализа отдельных строк.

0 голосов
/ 20 мая 2016
  1. подход Вы можете анализировать файлы с помощью регулярного выражения, это общая идея

  2. Разделить и выиграть

    2.1.Разделить на строки

    2.2.Разделите строки словами.Что касается n слов, вы знаете, какой формат вы ожидаете

    2.3.если 2.2 недостаточно, примените регулярное выражение для строки, чтобы получить данные.

    2.4.если 2.3 недостаточно, возможно, у вас есть регионы, заголовок, финансовая информация 1, финансовая информация 2, используйте 2.1 и 2.2, чтобы узнать, где вы находитесь, и сохраните свое состояние, используйте это состояние для применения необходимых вам правил.

...