EDIFACT ve TRADACOMS gibi bazı ünlü dosya formatlarına ayrıştırıcı yapmak için daha iyi bir çözüm bulmaya çalışıyorum .
Bu standartlara aşina değilseniz Wikipedia'dan bu örneği inceleyin:
Ürün kullanılabilirliği talebini yanıtlamak için kullanılan bir EDIFACT mesajı örneği için aşağıya bakın: -
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'
UNA segmenti isteğe bağlıdır. Varsa, iletinin geri kalanını yorumlamak için kullanılacak özel karakterleri belirtir. Bu sırayla UNA'yı takip eden altı karakter var:
- bileşen veri elemanı ayırıcı (: bu örnekte)
- veri elemanı ayırıcısı (bu örnekte +)
- ondalık bildirim (. bu örnekte)
- serbest bırakma karakteri (? bu örnekte)
- ayrılmış, boşluk olmalı
- segment sonlandırıcısı (bu örnekte ')
Gördüğünüz gibi, sadece ayrıştırılmayı bekleyen özel bir şekilde biçimlendirilmiş bazı veriler ( XML dosyaları gibi ).
Şimdi sistemim PHP üzerine kurulu ve ben her segment için düzenli ifadeler kullanarak ayrıştırıcı oluşturmak başardı, ama sorun herkes standart mükemmel uygular değildir.
Bazı tedarikçiler, isteğe bağlı segmentleri ve alanları tamamen göz ardı etme eğilimindedir. Diğerleri diğerlerinden daha fazla veri göndermeyi seçebilir. Bu nedenle, dosyanın doğru olup olmadığını test etmek için segmentler ve alanlar için doğrulayıcılar oluşturmak zorunda kaldım.
Şu anda düzenli ifadelerin kabusunu hayal edebilirsiniz. Buna ek olarak, her tedarikçi, her tedarikçi için bir ayrıştırıcı oluşturma eğiliminde olduğum düzenli ifadelerde birçok değişikliğe ihtiyaç duyar.
Sorular:
1- Bu dosyaları ayrıştırmak için en iyi yöntem midir (düzenli ifadeler kullanarak)?
2- Dosyaları ayrıştırmak için daha iyi bir çözüm var mı (belki orada hazır çözüm var)? Hangi segmentin eksik olduğunu veya dosyanın bozuk olup olmadığını gösterebilecek mi?
3- Ayrıştırıcımı yine de inşa etmem gerekirse hangi tasarım desenini veya metodolojisini kullanmalıyım?
Notlar:
Ycc ve ANTLR hakkında bir yer okudum ama ihtiyaçlarımı karşılayıp karşılamadıklarını bilmiyorum!