私は EDIFACT メッセージを扱っており、生のファイル形式から関連情報を解析して抽出するのに役立つ多くのツールを開発しました。
私が常に苦労してきたのは、生の EDIFACT を提示することです。私は通常、メッセージを Microsoft Word にコピーし、セグメントの区切り文字を検索して置換し、内容を 1 行ずつ表示します。
私は常に EDIFACT ファイルを階層形式で表示したいと思っていましたが、これを行う方法を見つけることはできません。
以下は、生の EDIFACT メッセージの抜粋です。左側はデータの取得方法 (行番号は含まない) を示し、右側は顧客の仕様に基づいてデータを表示する方法を示しています。
01. UNA -UNA
02. UNB -UNB
03. UNH -UNH
04. BGM -BGM
05. DTM - | DTM
06. DTM - | DTM
07. DTM - | DTM
08. NAD - | NAD
09. NAD - | NAD
10. NAD - | NAD
11. GIS - | GIS
12. LIN - | | LIN
13. LOC - | | | LOC
14. LOC - | | | LOC
15. LOC - | | | LOC
16. RFF - | | | RFF
17. QTY - | | | QTY
18. QTY - | | | QTY
19. RFF - | | | | RFF
20. DTM - | | | | | DTM
21. SCC - | | | SCC
22. QTY - | | | | QTY
23. DTM - | | | | | DTM
24. DTM - | | | | | DTM
25. SCC - | | | SCC
26. QTY - | | | | QTY
27. DTM - | | | | | DTM
28. DTM - | | | | | DTM
29. SCC - | | | SCC
30. QTY - | | | | QTY
31. DTM - | | | | | DTM
32. QTY - | | | | QTY
33. DTM - | | | | | DTM
34. SCC - | | | SCC
35. QTY - | | | | QTY
36. DTM - | | | | | DTM
37. NAD - | | | NAD
38. CTA - | | | | CTA
39. COM - | | | | | COM
40. SCC - | | | | SCC
41. QTY - | | | | | QTY
42. UNT -UNT
43. UNZ -UNZ
データはツリー ベースであり、私に送信された仕様によって記述されていることがわかります。上記の EDIFACT メッセージの 1 つの仕様は次のとおりです。
Tag St Max Lvl
0000 1 UNA C 1 0 SERVICE STRING ADVICE
0000 2 UNB M 1 0 INTERCHANGE HEADER
0010 3 UNH M 1 0 MESSAGE HEADER
0020 4 BGM M 1 0 BEGINNING OF MESSAGE
0030 5 DTM M 10 1 DATE/TIME/PERIOD
0040 6 FTX C 5 1 FREE TEXT
0080 SG2 C 99 1 NAD
0090 7 NAD M 1 1 NAME AND ADDRESS
0190 SG6 C 9999 1 GIS-SG7-SG12
0200 8 GIS M 1 1 GENERAL INDICATOR
0210 SG7 C 1 2 NAD
0220 9 NAD M 1 2 NAME AND ADDRESS
0370 SG12 C 9999 2 LIN-LOC-FTX-SG13-SG15-SG17-SG22
0380 10 LIN M 1 2 LINE ITEM
0450 11 LOC C 999 3 PLACE/LOCATION IDENTIFICATION
0470 12 FTX C 5 3 FREE TEXT
0480 SG13 C 10 3 RFF
0490 13 RFF M 1 3 REFERENCE
0540 SG15 C 10 3 QTY-SG16
0550 14 QTY M 1 3 QUANTITY
0570 SG16 C 10 4 RFF-DTM
0580 15 RFF M 1 4 REFERENCE
0590 16 DTM C 1 5 DATE/TIME/PERIOD
0600 SG17 C 999 3 SCC-SG18
0610 17 SCC M 1 3 SCHEDULING CONDITIONS
0620 SG18 C 999 4 QTY-DTM
0630 18 QTY M 1 4 QUANTITY
0640 19 DTM C 2 5 DATE/TIME/PERIOD
0760 SG22 C 999 3 NAD-SG24-SG27
0770 20 NAD M 1 3 NAME AND ADDRESS
0830 SG24 C 5 4 CTA-COM
0840 21 CTA M 1 4 CONTACT INFORMATION
0850 22 COM C 5 5 COMMUNICATION CONTACT
0920 SG27 M 999 4 SCC-SG28
0940 SG28 M 999 5 QTY
0950 24 QTY M 1 5 QUANTITY
1030 25 UNT M 1 0 MESSAGE TRAILER
0000 26 UNZ M 1 0 INTERCHANGE TRAILER
重要な列は、Tag、St (M=必須、C=条件付き)、Max (反復できる最大回数)、lvl (ツリーの深さ) です。SG で始まるタグは、ループがあることを示します
私が直面している問題は、形式が非常に柔軟で、条件付きセグメント、条件付きループ、繰り返しセグメントを含めることができることです。これらすべてを処理できる方法を考えようとすることが私の問題でした。
上記の仕様の上から見てDTMタグに来ると、最大10回まで繰り返すことができることがすぐにわかります。サンプルの EDIFACT メッセージでは、5、6、7 行目に 3 回だけ表示されます。仕様に従って、FTX が表示される場合がありますが、サンプル メッセージには表示されません。SG2 タグがあり、次の NAD タグが 99 を繰り返す可能性があることを意味します。回。
LIN タグ (SG12 グループの下にあり、9999 回まで繰り返すことができ、多くの場合、何回も繰り返すことができます) 内で少し先に進むと、最初の QTY タグに到達します。仕様によると、このセグメントは、その下に条件付きグループ (SG15) RFF と DTM を持つことができます。私のサンプルを使用すると、17 行目と 18 行目に QTY セグメントがあることがわかりますが、18 行目にはこの条件付きグループもあります。
SCC セグメントを調べると、同様のことが起こり始めます。
私が考えているのは、その仕様をある種のファイル形式に入力し、この仕様のルールに対して生の EDIFACT メッセージを実行できるようにすることです。これにより、出力は階層ベースになり、どのデータが一目で簡単にわかります。どのセグメントと、EDIFACT メッセージが有効かどうかを確認する方法に関連しています。
私が問題を抱えているのは、その変換を行う実際のアルゴリズムまたはプロセスです。
行ごとに移動するなどの素朴なアプローチを試しましたが、現在の行がグループ内にあるか、繰り返しか、または何か他のものであるかどうかを調べようとすると、面倒になります。EDIFACT 全体を最大のグループ (SG12-LIN グループ) で分割し、それぞれの分割を再帰的に処理して出力を構築するという、再帰的なアプローチを試みました。これはまだ私の最善のアプローチですが、私の論理が正しくないため、多くの誤った読み取りに対処するにはまだほど遠いです.
基本的に、メッセージのセグメントを選択し、階層内のどこにあるのかを判断して表示できるようにする必要があります。
どうすればこれを解決できるか途方に暮れています。これを行うための簡単な方法があると確信していますが、うまくいきません。
どんな援助でも大歓迎です。
ちょっと更新。
仕様の階層に従って、仕様を XML ファイルに変換しました。この XML ファイルには、各タグに関連するすべてのグループとさまざまな属性が含まれています。これで、EDIFACT が準拠する必要があるものについても開始しました。
紙の上で(そして頭の中で)それを調べて、少し前向きな考え方でやろうとしている出力を構築できる場合、私の新しいアイデアは、EDIFACTファイルで「先にスキャン」し、おそらくベースの結果。チェスの AI が数手先を見るのと少し似ています。