Sto cercando di trovare una soluzione migliore per creare un parser in alcuni dei formati di file famosi come EDIFACT e TRADACOMS .
Se non hai familiarità con questi standard, dai un'occhiata a questo esempio da Wikipedia:
Vedi sotto per un esempio di un messaggio EDIFACT utilizzato per rispondere a una richiesta di disponibilità del prodotto: -
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'
Il segmento UNA è facoltativo. Se presente, specifica i caratteri speciali che devono essere utilizzati per interpretare il resto del messaggio. Ci sono sei caratteri che seguono UNA in questo ordine:
- separatore elemento dati componente (: in questo esempio)
- separatore elemento dati (+ in questo esempio)
- notifica decimale (. in questo esempio)
- carattere di rilascio (? in questo esempio)
- riservato, deve essere uno spazio
- terminatore di segmento ('in questo esempio)
Come puoi vedere sono solo alcuni dati formattati in un modo speciale in attesa di essere analizzati (proprio come i file XML ).
Ora il mio sistema è basato su PHP e sono stato in grado di creare un parser usando espressioni regolari per ogni segmento, ma il problema non è che tutti implementano perfettamente lo standard.
Alcuni fornitori tendono a ignorare completamente segmenti e campi opzionali. Altri possono scegliere di inviare più dati di altri. Ecco perché sono stato costretto a creare validatori per segmenti e campi per verificare se il file era corretto o meno.
Puoi immaginare l'incubo delle espressioni regolari che sto vivendo in questo momento. Inoltre, ogni fornitore ha bisogno di molte modifiche alle espressioni regolari che tendo a costruire un parser per ogni fornitore.
Domande:
1- È questa la migliore pratica per l'analisi dei file (usando espressioni regolari)?
2- Esiste una soluzione migliore per l'analisi dei file (forse ci sono soluzioni già pronte là fuori)? Sarà in grado di mostrare quale segmento manca o se il file è danneggiato?
3- Se devo compilare il mio parser comunque quale modello di progettazione o metodologia dovrei usare?
Appunti:
Ho letto da qualche parte su Yacc e ANTLR, ma non so se soddisfino le mie esigenze o no!