EDIFACTやTRADACOMSなどの有名なファイル形式をパーサーで作成するためのより良い解決策を見つけようとしています。
これらの標準に慣れていない場合は、Wikipediaからこの例を確認してください。
製品の在庫状況のリクエストに回答するために使用されるEDIFACTメッセージの例については、以下を参照してください。
UNA:+.? '
UNB+IATB:1+6XPPC+LHPPC+940101:0950+1'
UNH+1+PAORES:93:1:IA'
MSG+1:45'
IFT+3+XYZCOMPANY AVAILABILITY'
ERC+A7V:1:AMD'
IFT+3+NO MORE FLIGHTS'
ODI'
TVL+240493:1000::1220+FRA+JFK+DL+400+C'
PDI++C:3+Y::3+F::1'
APD+714C:0:::6++++++6X'
TVL+240493:1740::2030+JFK+MIA+DL+081+C'
PDI++C:4'
APD+EM2:0:130::6+++++++DA'
UNT+13+1'
UNZ+1+1'
UNAセグメントはオプションです。存在する場合は、メッセージの残りの部分を解釈するために使用される特殊文字を指定します。この順序でUNAに続く6文字があります。
- コンポーネントデータ要素セパレータ(:このサンプルでは)
- データ要素セパレータ(このサンプルでは+)
- 10進数の通知(このサンプルでは。)
- リリースキャラクター(このサンプルでは?)
- 予約済み、スペースでなければならない
- セグメントターミネーター(このサンプルでは ')
ご覧のとおり、解析されるのを待機している特別な方法でフォーマットされたデータの一部です(XMLファイルのように)。
現在、私のシステムはPHPで構築されており、セグメントごとに正規表現を使用してパーサーを作成できましたが、問題は誰もが標準を完全に実装しているわけではないということです。
一部のサプライヤーは、オプションのセグメントとフィールドを完全に無視する傾向があります。他の人は他より多くのデータを送信することを選択するかもしれません。そのため、ファイルが正しいかどうかをテストするために、セグメントとフィールドのバリデーターを作成する必要がありました。
私が今持っている正規表現の悪夢を想像できます。さらに、各サプライヤーは、各サプライヤーのパーサーを作成する傾向がある正規表現に多くの変更を加える必要があります。
質問:
1-これは(正規表現を使用して)ファイルを解析するためのベストプラクティスですか?
2-ファイルを解析するためのより良いソリューションはありますか(おそらくそこに既製のソリューションがあるでしょう)?どのセグメントが欠落しているか、またはファイルが破損しているかを表示できますか?
3-とにかくパーサーを構築する必要がある場合、どの設計パターンまたは方法論を使用する必要がありますか?
ノート:
yaccとANTLRについてどこかで読みましたが、私のニーズに合っているかどうかはわかりません。