Próbuję znaleźć lepsze rozwiązanie do tworzenia parsera niektórych znanych formatów plików, takich jak: EDIFACT i TRADACOMS .
Jeśli nie znasz tych standardów, sprawdź ten przykład z Wikipedii:
Poniżej znajduje się przykład komunikatu EDIFACT wykorzystanego do odpowiedzi na żądanie dostępności produktu: -
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'
Segment UNA jest opcjonalny. Jeśli jest obecny, określa znaki specjalne, których należy użyć do interpretacji pozostałej części wiadomości. UNA ma sześć znaków w następującej kolejności:
- separator elementu danych komponentu (: w tym przykładzie)
- separator elementu danych (+ w tym przykładzie)
- powiadomienie dziesiętne (w tej próbce)
- znak zwolnienia (? w tym przykładzie)
- zastrzeżone, musi być spacją
- terminator segmentu („w tym przykładzie)
Jak widać, to tylko niektóre dane sformatowane w specjalny sposób, które czekają na parsowanie (podobnie jak pliki XML ).
Teraz mój system jest oparty na PHP i byłem w stanie stworzyć parser używając wyrażeń regularnych dla każdego segmentu, ale problem nie polega na tym, że wszyscy doskonale implementują standard.
Niektórzy dostawcy całkowicie ignorują opcjonalne segmenty i pola. Inni mogą zdecydować o wysłaniu większej ilości danych niż inni. Dlatego zmuszono mnie do utworzenia walidatorów dla segmentów i pól, aby sprawdzić, czy plik jest poprawny, czy nie.
Możesz sobie wyobrazić koszmar wyrażeń regularnych, który mam teraz. Ponadto każdy dostawca potrzebuje wielu modyfikacji wyrażeń regularnych, które zwykle buduję analizator składni dla każdego dostawcy.
Pytania:
1- Czy to najlepsza praktyka do analizowania plików (przy użyciu wyrażeń regularnych)?
2- Czy jest lepsze rozwiązanie do analizowania plików (być może istnieje gotowe rozwiązanie)? Czy będzie w stanie pokazać, którego segmentu brakuje lub czy plik jest uszkodzony?
3- Jeśli muszę mimo to zbudować analizator składni, jakiego wzoru lub metodologii powinienem użyć?
Uwagi:
Czytałem gdzieś o yacc i ANTLR, ale nie wiem, czy odpowiadają moim potrzebom, czy nie!