2014-04-04 38 views
1

我需要從大型日誌文件中提取所有FIX消息,這些消息可能包含10000到20000個FIX協議消息。 FIX協議消息,我期望獲取將從8=FIX開始,並以|10=一些CheckSum值可能是任何值,然後是分隔符'|'從正則表達式中的日誌文件解析FIX協議消息?

例如8=FIXT.1.1|9=449|35=AE|34=1734|49=REPOFIXUAT|52=20140402-11:38:34|56=TR_UAT_VENDOR|1128=8|15=GBP|31=1.7666|32=50000000.00|55=GBP/USD|60=20140402-11:07:33|63=B|64=20140415|65=OR|75=20140402|150=F|167=FOR|194=1.7654|195=0.0012|460=4|571=7852455|1003=2 USD|1056=88330000.00|1057=N|552=1|54=2|37=20140402-12:36:48|11=NOREF|453=4|448=ZERO|447=D|452=3|448=MBY2|447=D|452=1|448=LMEB|447=D|452=16|448=DOR|447=D|452=11|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|10=111|

目前,我使用這個模式的正則表達式

Pattern pattern = Pattern.compile("8=FIX(.*?)10=(.*?)|");

但上面的圖案,我只能夠提取的消息,直到10=但不校驗值,也可能有這樣一個場景,一些FIX消息自定義標籤就像8410 = TEST |如下:

8=FIXT.1.1|9=73|35=0|34=560|49=RTNSFIXUAT|8410=TEST|52=20140403-01:50:21|56=TR_UAT_VELOCITY|1128=8|10=206|

這裏以上,我會得到的值

「8 = FIXT.1.1 | 9 = 73 | 35 = 0 | 34 = 560 | 49 = RTNSFIXUAT | 84" (X - 我想,直到標籤10校驗和值完整消息206

請查找日誌文件摘錄如下:

>02-04-14 11:38:33.559|QFJ Message Processor|input/REPOFIXInput1|INFO|quickfix.outgoing: 8=FIXT.1.1|9=71|35=0|34=1731|49=TR_UAT_VENDOR|52=20140402-11:38:33.557|56=REPOFIXUAT|10=147| 
02-04-14 11:38:34.713|SocketConnectorIoProcessor-1.0|input/REPOFIXInput1|INFO|quickfix.incoming: 8=FIXT.1.1|9=449|35=AE|34=1734|1128=8|49=REPOFIXUAT|56=TR_UAT_VENDOR|52=20140402-11:38:34|552=1|54=2|37=20140402-12:36:48|11=NOREF|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|453=4|448=ZERO|452=3|447=D|448=MBY2|452=1|447=D|448=LMEB|452=16|447=D|448=DOR|452=11|447=D|571=7852455|1003=2 USD|150=F|32=50000000.00|15=GBP|1056=88330000.00|31=1.6666|194=1.6654|195=0.0012|64=20140415|63=B|60=20140402-11:07:33|75=20140402|1057=N|460=4|167=FOR|65=OR|55=GBP/USD|10=111| 
02-04-14 11:38:35.004|QFJ Message Processor|input/REPOFIXInput1|INFO|Received FIX application message: 8=FIXT.1.1|9=449|35=AE|34=1734|49=REPOFIXUAT|52=20140402-11:38:34|56=TR_UAT_VENDOR|1128=8|15=GBP|31=1.7666|32=50000000.00|55=GBP/USD|60=20140402-11:07:33|63=B|64=20140415|65=OR|75=20140402|150=F|167=FOR|194=1.7654|195=0.0012|460=4|571=7852455|1003=2 USD|1056=88330000.00|1057=N|552=1|54=2|37=20140402-12:36:48|11=NOREF|453=4|448=ZERO|447=D|452=3|448=MBY2|447=D|452=1|448=LMEB|447=D|452=16|448=DOR|447=D|452=11|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|10=111| 
+0

在NIX系統中使用'cut'命令或在Windows上使用cygwin。也許是2分鐘的工作。 – DumbCoder

回答

1

如果我理解正確的話,你要保留:

一切 8=FIX
  • 但在此之前|10=...
  • 此外,在|10=value|

這裏的值是一個例子:

String input = ">02-04-14 11:38:33.559|QFJ Message Processor|input/REPOFIXInput1|INFO|quickfix.outgoing: 8=FIXT.1.1|9=71|35=0|34=1731|49=TR_UAT_VENDOR|52=20140402-11:38:33.557|56=REPOFIXUAT|10=147|\r\n" 
         + "02-04-14 11:38:34.713|SocketConnectorIoProcessor-1.0|input/REPOFIXInput1|INFO|quickfix.incoming: 8=FIXT.1.1|9=449|35=AE|34=1734|1128=8|49=REPOFIXUAT|56=TR_UAT_VENDOR|52=20140402-11:38:34|552=1|54=2|37=20140402-12:36:48|11=NOREF|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|453=4|448=ZERO|452=3|447=D|448=MBY2|452=1|447=D|448=LMEB|452=16|447=D|448=DOR|452=11|447=D|571=7852455|1003=2 USD|150=F|32=50000000.00|15=GBP|1056=88330000.00|31=1.6666|194=1.6654|195=0.0012|64=20140415|63=B|60=20140402-11:07:33|75=20140402|1057=N|460=4|167=FOR|65=OR|55=GBP/USD|10=111|\r\n" 
         + "02-04-14 11:38:35.004|QFJ Message Processor|input/REPOFIXInput1|INFO|Received FIX application message: 8=FIXT.1.1|9=449|35=AE|34=1734|49=REPOFIXUAT|52=20140402-11:38:34|56=TR_UAT_VENDOR|1128=8|15=GBP|31=1.7666|32=50000000.00|55=GBP/USD|60=20140402-11:07:33|63=B|64=20140415|65=OR|75=20140402|150=F|167=FOR|194=1.7654|195=0.0012|460=4|571=7852455|1003=2 USD|1056=88330000.00|1057=N|552=1|54=2|37=20140402-12:36:48|11=NOREF|453=4|448=ZERO|447=D|452=3|448=MBY2|447=D|452=1|448=LMEB|447=D|452=16|448=DOR|447=D|452=11|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|10=111|"; 
    Pattern p = Pattern.compile("8=FIX(.+)(?<=\\|)10=(.+?)(?=\\|)", Pattern.MULTILINE); 
    Matcher m = p.matcher(input); 
    while (m.find()) { 
     System.out.println(m.group()); 
     System.out.println("\t" + m.group(1)); 
     System.out.println("\t" + m.group(2)); 
    } 

輸出

8=FIXT.1.1|9=71|35=0|34=1731|49=TR_UAT_VENDOR|52=20140402-11:38:33.557|56=REPOFIXUAT|10=147 
    T.1.1|9=71|35=0|34=1731|49=TR_UAT_VENDOR|52=20140402-11:38:33.557|56=REPOFIXUAT| 
    147 
8=FIXT.1.1|9=449|35=AE|34=1734|1128=8|49=REPOFIXUAT|56=TR_UAT_VENDOR|52=20140402-11:38:34|552=1|54=2|37=20140402-12:36:48|11=NOREF|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|453=4|448=ZERO|452=3|447=D|448=MBY2|452=1|447=D|448=LMEB|452=16|447=D|448=DOR|452=11|447=D|571=7852455|1003=2 USD|150=F|32=50000000.00|15=GBP|1056=88330000.00|31=1.6666|194=1.6654|195=0.0012|64=20140415|63=B|60=20140402-11:07:33|75=20140402|1057=N|460=4|167=FOR|65=OR|55=GBP/USD|10=111 
    T.1.1|9=449|35=AE|34=1734|1128=8|49=REPOFIXUAT|56=TR_UAT_VENDOR|52=20140402-11:38:34|552=1|54=2|37=20140402-12:36:48|11=NOREF|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|453=4|448=ZERO|452=3|447=D|448=MBY2|452=1|447=D|448=LMEB|452=16|447=D|448=DOR|452=11|447=D|571=7852455|1003=2 USD|150=F|32=50000000.00|15=GBP|1056=88330000.00|31=1.6666|194=1.6654|195=0.0012|64=20140415|63=B|60=20140402-11:07:33|75=20140402|1057=N|460=4|167=FOR|65=OR|55=GBP/USD| 
    111 
8=FIXT.1.1|9=449|35=AE|34=1734|49=REPOFIXUAT|52=20140402-11:38:34|56=TR_UAT_VENDOR|1128=8|15=GBP|31=1.7666|32=50000000.00|55=GBP/USD|60=20140402-11:07:33|63=B|64=20140415|65=OR|75=20140402|150=F|167=FOR|194=1.7654|195=0.0012|460=4|571=7852455|1003=2 USD|1056=88330000.00|1057=N|552=1|54=2|37=20140402-12:36:48|11=NOREF|453=4|448=ZERO|447=D|452=3|448=MBY2|447=D|452=1|448=LMEB|447=D|452=16|448=DOR|447=D|452=11|826=0|78=1|79=default|80=50000000.00|5967=88330000.00|10=111 
    T.1.1|9=449|35=AE|34=1734|49=REPOFIXUAT|52=20140402-11:38:34|56=TR_UAT_VENDOR|1128=8|15=GBP|31=1.7666|32=50000000.00|55=GBP/USD|60=20140402-11:07:33|63=B|64=20140415|65=OR|75=20140402|150=F|167=FOR|194=1.7654|195=0.0012|460=4|571=7852455|1003=2 USD|1056=88330000.00|1057=N|552=1|54=2|37=20140402-12:36:48|11=NOREF|453=4|448=ZERO|447=D|452=3|448=MBY2|447=D|452=1|448=LMEB|447=D|452=16|448=DOR|447=D|452=11|826=0|78=1|79=default|80=50000000.00|5967=88330000.00| 
    111 

  • 這個例子不是性能優化。
  • 你可能想以恆定Pattern
  • 單獨刪除了「多行」標誌這一Pattern,並把每一行。如果你這樣做,你將不得不重新初始化爲每條線路Matcher,但你可以可能跟findif語句而不是一個while聲明,假設你有每行
  • 一個日誌存儲匹配的值是你
+0

謝謝梅納,上面的示例方法爲我工作,但如果我通過我的日誌文件處理它不給結果。我相信這是因爲'\ r \ n',你明確地在上面的代碼中加入了模式匹配。 而且,正如我在我的問題中寫到的,我需要從文件處理10到20K FIX消息。所以在這種情況下,我需要寫'm.group(),m.group(1),m.group(2)'直到20K。 請在上面提出建議。 Registers – Anky

+0

@Ankit正如註釋中提到的那樣,你想要的'Pattern'可能沒有多行標誌(只是刪除它),因爲你會一行一行地處理你的文件。還提到:存儲匹配的值取決於您,無論是將它們放入文件,數據庫還是(由於大小而更危險)將它們存儲在內存中。正如你所看到的,你只需要組1和組2;主隊是整場比賽。 – Mena

+0

許多再次感謝,但截至目前我不關心保存這些消息。我仍然沒有通過使用上面的正則表達式從日誌中得到預期的消息(可能是我失去了一些東西),但我試過'8 = FIX(。*?)(?<=)〜10 =(。*?)〜'regex在Regex教程上花費一些時間在網絡上的表達,併爲我工作。 請建議它可以適用於所有場景,或者我缺少任何特定的場景,因爲我是新來的正則表達式世界。 – Anky

0

所以它是一個好主意,你的所有的FIX消息持久化到數據庫中,一旦他們「處理智慧h「並避免所有這些。

+0

數據庫將比寫入文件慢得多。 – DumbCoder

+0

是的,所以使用消息代理完成工作,然後堅持這裏所需的報告。 – rupweb

0

我明白,我使用"|" (pipe)如FIX消息分隔符的問題,但它也存在於日誌註釋(02-04-14 14:30:45.139|QFJ Timer|input/FIXInput1|INFO|Sending FIX session message: 8=FIXT.1.1|9=71|35=0|34=2072|49=UAT|52=20140402-14:30:45.139|56=FIXUAT|10=140| 02-04-14 14:30:45.141|QFJ Timer|input/FIXInput1|DEBUG|FIX message as XML: <?xml version="1.0" encoding="ISO-8859-1"?><message>),將其不使FIX間的分隔符之後處理所述圖案直到的10=checksum結束和現在消息標記爲"~" (tilde)以我的上述模式ie'8 = FIX(。?)(?< =)〜10 =(。?)〜'那麼它對我來說就像上面解決方案所提供的REGEX類似。