Estou tentando encontrar uma solução melhor para fazer um analisador para alguns dos famosos formatos de arquivo existentes, como: EDIFACT e TRADACOMS .
Se você não estiver familiarizado com esses padrões, verifique este exemplo da Wikipedia:
Veja abaixo um exemplo de uma mensagem EDIFACT usada para responder a uma solicitação de disponibilidade do produto: -
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'
O segmento UNA é opcional. Se presente, especifica os caracteres especiais que devem ser usados para interpretar o restante da mensagem. Existem seis caracteres após UNA nesta ordem:
- separador de elemento de dados do componente (: neste exemplo)
- separador de elemento de dados (+ neste exemplo)
- notificação decimal (. neste exemplo)
- caractere de liberação (? neste exemplo)
- reservado, deve ser um espaço
- terminador de segmento ('neste exemplo)
Como você pode ver, são apenas alguns dados formatados de uma maneira especial, esperando para serem analisados (como arquivos XML ).
Agora, meu sistema é construído em PHP e eu consegui criar um analisador usando expressões regulares para cada segmento, mas o problema é que nem todo mundo implementa o padrão perfeitamente.
Alguns fornecedores tendem a ignorar totalmente segmentos e campos opcionais. Outros podem optar por enviar mais dados do que outros. Por isso fui forçado a criar validadores para segmentos e campos para testar se o arquivo estava correto ou não.
Você pode imaginar o pesadelo das expressões regulares que estou tendo agora. Além disso, cada fornecedor precisa de muitas modificações nas expressões regulares que tendem a criar um analisador para cada fornecedor.
Questões:
1- Essa é a melhor prática para analisar arquivos (usando expressões regulares)?
2- Existe uma solução melhor para a análise de arquivos (talvez exista uma solução pronta para uso)? Será capaz de mostrar qual segmento está faltando ou se o arquivo está corrompido?
3- Se eu tiver que construir meu analisador de qualquer maneira, qual padrão ou metodologia de design devo usar?
Notas:
Eu li em algum lugar sobre yacc e ANTLR, mas não sei se eles correspondem às minhas necessidades ou não!