Ich versuche, eine bessere Lösung zu finden, um einen Parser für einige der bekannten Dateiformate wie EDIFACT und TRADACOMS zu erstellen .
Wenn Sie mit diesen Standards nicht vertraut sind, lesen Sie dieses Beispiel aus Wikipedia:
Im Folgenden finden Sie ein Beispiel für eine EDIFACT-Nachricht, die zur Beantwortung einer Produktverfügbarkeitsanfrage verwendet wird: -
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'
Das UNA-Segment ist optional. Wenn vorhanden, gibt es die Sonderzeichen an, die zur Interpretation des Restes der Nachricht verwendet werden sollen. Es gibt sechs Zeichen nach UNA in dieser Reihenfolge:
- Komponentendatenelementtrennzeichen (: in diesem Beispiel)
- Datenelementtrennzeichen (+ in diesem Beispiel)
- Dezimalbenachrichtigung (. in diesem Beispiel)
- Release-Charakter (? in diesem Beispiel)
- reserviert, muss ein Platz sein
- Segmentterminator ('in diesem Beispiel)
Wie Sie sehen, sind es nur einige Daten, die auf spezielle Weise formatiert wurden und darauf warten, analysiert zu werden (ähnlich wie XML- Dateien).
Jetzt basiert mein System auf PHP und ich konnte einen Parser mit regulären Ausdrücken für jedes Segment erstellen, aber das Problem ist, dass nicht jeder den Standard perfekt implementiert.
Einige Lieferanten neigen dazu, optionale Segmente und Felder vollständig zu ignorieren. Andere senden möglicherweise mehr Daten als andere. Aus diesem Grund musste ich Validatoren für Segmente und Felder erstellen, um zu testen, ob die Datei korrekt war oder nicht.
Sie können sich den Albtraum der regulären Ausdrücke vorstellen, die ich gerade habe. Darüber hinaus benötigt jeder Lieferant viele Änderungen an den regulären Ausdrücken, sodass ich für jeden Lieferanten einen Parser erstelle.
Fragen:
1- Ist dies die beste Vorgehensweise zum Parsen von Dateien (unter Verwendung regulärer Ausdrücke)?
2- Gibt es eine bessere Lösung für das Parsen von Dateien (vielleicht gibt es da draußen eine fertige Lösung)? Kann es zeigen, welches Segment fehlt oder ob die Datei beschädigt ist?
3- Wenn ich meinen Parser trotzdem erstellen muss, welches Entwurfsmuster oder welche Methodik sollte ich verwenden?
Anmerkungen:
Ich habe irgendwo über Yacc und ANTLR gelesen, aber ich weiß nicht, ob sie meinen Bedürfnissen entsprechen oder nicht!