EDIFACT 및 TRADACOMS 와 같은 유명한 파일 형식 중 일부에 대한 파서를 만드는 더 나은 솔루션을 찾으려고 합니다.
이러한 표준에 익숙하지 않은 경우 Wikipedia에서이 예제를 확인하십시오.
제품 가용성 요청에 응답하는 데 사용되는 EDIFACT 메시지의 예는 아래를 참조하십시오.
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 세그먼트는 선택 사항입니다. 있는 경우 나머지 메시지를 해석하는 데 사용할 특수 문자를 지정합니다. UNA 다음에이 순서대로 6 개의 문자가 있습니다.
- 구성 요소 데이터 요소 구분 기호 (:이 샘플에서)
- 데이터 요소 구분 기호 (이 샘플에서 +)
- 소수 알림 (이 샘플에서는.)
- 릴리스 문자 (이 샘플에서?)
- 예약 된 공간이어야합니다.
- 세그먼트 종결 자 (이 샘플에서 ')
보시다시피 파싱을 기다리는 특별한 방식으로 포맷 된 일부 데이터 일뿐입니다 ( XML 파일 과 매우 유사 ).
이제 내 시스템은 PHP로 작성되었으며 각 세그먼트에 대해 정규 표현식을 사용하여 파서를 만들 수 있었지만 문제가 모든 사람이 표준을 완벽하게 구현하는 것은 아닙니다.
일부 공급 업체는 선택적 세그먼트 및 필드를 완전히 무시하는 경향이 있습니다. 다른 사람들은 다른 사람들보다 더 많은 데이터를 보내도록 선택할 수 있습니다. 그래서 파일과 파일이 올바른지 테스트 할 세그먼트와 필드에 대한 유효성 검사기를 작성해야했습니다.
내가 지금 가지고있는 정규 표현식의 악몽을 상상할 수 있습니다. 또한 각 공급 업체마다 정규 표현식을 많이 수정해야하므로 각 공급 업체마다 파서를 작성하는 경향이 있습니다.
질문 :
1- 파일을 구문 분석하는 데 가장 적합한 방법입니까 (정규 표현식 사용)?
2- 파일을 파싱하기위한 더 나은 솔루션이 있습니까 (아마도 이미 준비된 솔루션이 있습니까)? 누락 된 세그먼트 또는 파일이 손상된 경우 표시 할 수 있습니까?
3- 어쨌든 파서를 작성 해야하는 경우 어떤 디자인 패턴이나 방법을 사용해야합니까?
노트:
나는 yacc와 ANTLR에 관한 어딘가를 읽었지만 그것들이 나의 요구와 일치하는지 아닌지는 모른다!