Saya mencoba mencari solusi yang lebih baik untuk membuat parser ke beberapa format file terkenal di luar sana seperti: EDIFACT dan TRADACOMS .
Jika Anda tidak terbiasa dengan standar ini maka lihat contoh ini dari Wikipedia:
Lihat di bawah untuk contoh pesan EDIFACT yang digunakan untuk menjawab permintaan ketersediaan produk: -
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'
Segmen UNA adalah opsional. Jika ada, itu menentukan karakter khusus yang akan digunakan untuk menafsirkan sisa pesan. Ada enam karakter yang mengikuti UNA dalam urutan ini:
- pemisah elemen data komponen (: dalam sampel ini)
- pemisah elemen data (+ dalam sampel ini)
- pemberitahuan desimal (. dalam sampel ini)
- rilis karakter (? dalam sampel ini)
- dipesan, harus spasi
- terminator segmen ('dalam sampel ini)
Seperti yang Anda lihat itu hanya beberapa data yang diformat dengan cara khusus menunggu untuk diuraikan (seperti file XML ).
Sekarang sistem saya dibangun di PHP dan saya bisa membuat parser menggunakan ekspresi reguler untuk setiap segmen, tetapi masalahnya tidak semua orang mengimplementasikan standar dengan sempurna.
Beberapa pemasok cenderung mengabaikan segmen dan bidang opsional sepenuhnya. Orang lain mungkin memilih untuk mengirim lebih banyak data daripada yang lain. Itu sebabnya saya terpaksa membuat validator untuk segmen dan bidang untuk menguji apakah file itu benar atau tidak.
Anda dapat membayangkan mimpi buruk ekspresi reguler yang saya alami sekarang. Selain itu setiap pemasok membutuhkan banyak modifikasi pada ekspresi reguler yang saya cenderung buat parser untuk setiap pemasok.
Pertanyaan:
1- Apakah ini praktik terbaik untuk mem-parsing file (menggunakan ekspresi reguler)?
2- Apakah ada solusi yang lebih baik untuk mem-parsing file (mungkin ada solusi yang sudah jadi di luar sana)? Apakah dapat menampilkan segmen apa yang hilang atau jika file rusak?
3 - Jika saya harus membuat parser saya, pola atau metodologi desain apa yang harus saya gunakan?
Catatan:
Saya membaca di suatu tempat tentang yacc dan ANTLR, tetapi saya tidak tahu apakah mereka cocok dengan kebutuhan saya atau tidak!