2010-01-22 6 views
11

저는 EDI를 처음 접했고 질문이 있습니다.EDI 형식의 파일 읽기

나는 당신이 ISA 라인의 마지막 3 자에보고하여 EDI 형식에 대한 필요의 대부분을 얻을 수 있다는 것을 읽었습니다. 모든 EDI가 행 분리를 사용하여 엔티티를 구분하는 경우에는 문제가 없지만 많은 수의 문자가 단락으로 사용되는 단일 행 파일임을 발견했습니다. 나는 내가 파싱 한 모든 EDI의 아주 마지막 문자가 중단 문자라는 것을 알아 챘다. 나는 몇 백 개를 보았고 이것에 대한 예외는 발견하지 못했다. 내가 처음으로 그 캐릭터를 잡아서 ISA 라인의 마지막 3 개를 얻는다면, EDI로부터 데이터를 파싱 할 수있을 것이라고 합리적으로 기대해야합니까?

이것이 도움이되는지는 잘 모르겠지만 문제의 EDI '유형'은 850,875 인 경향이 있습니다. 표준인지 아닌지는 잘 모르겠지만 언급할만한 가치가있을 수 있습니다.

+1

2010 년 EDI는 무엇입니까? 나는 XML이 조금 더 사용하기 쉽다고 생각했다. –

+6

수익의 90 %가 EDI에서 나오고있다. Walmart, Target, Toys R Us 및 기타 대형 소매 업체가 그 중 50 %를 차지합니다. 우리는 EDI를 좋아하기 때문에 EDI를 사용하지 않습니다. 고객이하기 때문에 EDI를 사용합니다. 이러한 대형 소매 업체가 다른 형식으로 변경하는 데는 시간당/비용이 들지 않습니다. 왜냐하면 작동하기 때문입니다. – Brandon

+1

제가 매출의 90 %를 말할 때, 저는 회사의 매출의 90 %를 의미한다고 이해했기를 바랍니다. – Brandon

답변

14

EDI의 거래 유형 (850 = 위해서는, 875 = 식료품 포) 정말 중요하지 않습니다. 몇 가지 edi 파서를 작성한 후 여기에 내가 찾은 몇 가지가 있습니다.

ISA (및 ISA 전용)는 고정 폭 (메모리가 작동하는 경우 105 자)으로 계산할 수 있어야합니다. 처음 105자를 제거합니다. 그 이후와 "GS"의 첫 번째 발생 전에는 줄 종결자가됩니다 (이것은 아무 것도 될 수 있습니다. 0x07을 포함하십시오 - 경고음 - 디버깅을 위해 stdout으로 출력하는지 조심하십시오) 또는 여러 번의 경고음이 올 수 있습니다 스피커 밖으로). 일반적으로 이것은 1 또는 2 자이며 때로는 더 많은 데이터가 될 수 있습니다 (데이터를 보내는 사람이 어떤 이유로 든 추가 터미네이터를 추가하는 경우). 일단 라인 종결자가 있으면 세그먼트 (필드) 구분 기호를 얻을 수 있습니다. 나는 일반적으로 GS 라인의 3 문자를 가져 와서 사용하지만 ISA 라인의 네 번째 문자도 잘 작동해야한다.

또한 당신이 그것을 여러 ISA 년대의 파일을 얻을 수 있음을 유의하십시오. 이 경우 당신은 수 없습니다 각 ISA 내에서 동일한 줄 또는 필드 구분 기호에 대한 개수.

또 다른 한가지는 .. 그것은 EDI 파일의 가변 길이 ISA를 가지고 (그 스펙이 있는지 확실하지 않습니다, 다시)도 가능하다. 이것은 매우 드물지만 그것을 수용해야했습니다. 그런 일이 생기면 선을 필드로 파싱해야합니다. ISA의 마지막 필드는 문자 길이가 길기 때문에 ISA의 실제 길이를 결정할 수 있습니다. 그것이 나라면, 당신이 그와 같은 파일을 보지 않는 한 나는 이것에 대해 걱정하지 않을 것입니다. 희소 한 출현이다.

내가 위에서 말한 내가 확실하지 않다, 즉 ...은 "사양"의 문자를하지 않을 수는 다른 라인 같은 파일에서 분리,하지만 서로 다른 ISA들에이 합법적 있지만, 그것은 기술적으로 가능하며 나는 그 방식으로 통과하는 파일을 처리해야하기 때문에 그것을 수용합니다. Edi 프로세서는 3000 개가 넘는 데이터 소스로 하루에 5000 개 이상의 파일을 처리합니다 (그래서 이상한 물건이 많이 보입니다).

안부, 돈

+0

돈, 대단한 반응이었습니다. 필자는 파일의 마지막 문자를 줄 바꿈 문자로 간주 할 수 있다고 생각했지만, 단일 ISA가 사용되고 있고 심지어는 1 문자 이상으로 사용되는 상황을 수용하지 못하는 경우에만 해당됩니다. 라인 터미네이터. 필자는 일하는 EDI 당 하나 이상의 ISA를 보지 못했고, 라인 종결 자 (line terminator)로 단일 문자를 넘어선 것도 없었습니다. 그러나 나는 그것에 대비할 수도있었습니다. – Brandon

+1

나중에 조심하세요. 사람들이 여분의 문자를 넣는 파일이나 라인 종결 자 다음에 오는 파일이 많이 보입니다. 일반적으로 null 또는 2 (0x00)입니다. 내가 뭘하는지 먼저 파일의 라인 터미네이터를 정규화합니다 - 라인 터미네이터로 0x0D/0x0A로 파일을 다시 쓰는 것입니다. 텍스트 편집기에서 파일을 읽기 쉽게하기 때문에 그렇게합니다. 그런 다음 파일을 검토하여 모든 ISA에 대해 일치하는 IEA가 있는지 확인하십시오. IEA 이후에 여분의 데이터가 있다면, 보통 폐기합니다. IEA 이후의 데이터가 부분 전송 (오류 조건)을 의미하는 ISAt로 시작하는 경우 –

+0

oops, 나는 "마지막 줄 종결 자 다음에 여분의 문자 하나 또는 두 개"라고 말하기를 ... 파일의 끝에. –

0

EDI 콘텐츠 세그먼트 요소들로 구성된다.

는 (PHP에서) 다음 요소를 같은 당신이 첫번째 부분으로 그것을 깰 필요가있을 것이다, 그것을 분석하고하려면

<?php 

$edi = "YOUR EDIT STRING!"; 
$segment_delimeter = "~"; 
$element_delimeter = "*"; 

//First break it into segments 
$segments = explode($segment_delimiter, $edi); 

//Now break each segment into elements 
$segs_and_elems = array(); 
foreach($segments as $segment){ 
    $segs_and_elems[] = explode(element_delimeter, $segment); 
} 

//To echo out what type of EDI this is for example: 
foreach($segs_and_elems as $seg){ 
    if($seg[0] == "GS"){ echo($seg[1]); } 
} 

?> 

희망이 시작하는 데 도움이됩니다.

0

헤더 정보는 다음 자바는 기본 정보가 아주 쉽게 얻을 수있게된다. C#도 분할되어 있으며 코드는 매우 비슷합니다.

try { 
    String sCurrentLine; 
    fileContent = new BufferedReader(new FileReader(filePathName)); 

    sCurrentLine = fileContent.readLine(); 

    // get the delimiter after ISA, if you know your field delimiter just force it. 
    // we look at lots of different senders messages so never sure what it will be. 

    delimiterElement = sCurrentLine.substring(3,1); // Grab the delimiter they are using 
    String[] splitMessage = sCurrentLine.split(delimiterElement,16); // to get the messages if everything is on one line of course 
    senderQualifier = splitMessage[5]; //who sent something we need fixed qualifier 
    senderID = splitMessage[6]; //who sent something we need fixed alias 
    ISA = splitMessage[13]; // Control number 
    testIndicator = splitMessage[15]; 
    dateStamp = splitMessage[9]; 
    timeStamp = splitMessage[10]; 

    ... do stuff with the pieces of info ...