读取EDI格式化文件

时间:2010-01-22 14:33:16

标签: parsing edi x12

我是EDI的新手,我有一个问题。

我已经读过,通过查看ISA行的最后3个字符,您可以获得有关EDI格式的大部分内容。如果每个EDI都使用换行符来分隔实体,这很好,但我发现很多都是单行文件,其中任意数量的字符用作中断。我注意到我解析的每个EDI中的最后一个字符都是break字符。我看了几百个,发现没有例外。如果我第一次抓住那个角色,并使用它来获得ISA线的最后3个,我是否应该合理地期望我能够从EDI解析数据?

我不知道这是否有帮助,但有问题的EDI'类型'往往是850,875。我不确定这是否是标准,但值得一提。

3 个答案:

答案 0 :(得分:14)

edi的交易类型并不重要(850 =订单,875 =杂货店)。写了几个edi解析器,这里有一些我发现的东西:

你应该能够指望固定宽度的ISA(和仅ISA)(如果内存服务,则为105个字符)。 去掉前105个字符。之后和“GS”第一次出现之前,一切都在你行终止(这可以是任何东西,包括0x07的 - 哔 - 因此要当心,如果你输出到标准输出的调试或你可能有未来的一堆蜂鸣声在演讲者之外)。通常这是1或2个字符,有时它可以更多(如果发送数据的人由于某种原因添加额外的终止符)。一旦有了行终止符,就可以得到段(字段)分隔符。我通常会拉出GS线的3个字符然后使用它,尽管ISA线的第4个字符也可以正常工作。

还要注意,你可以获得一个包含多个ISA的文件。在这种情况下,你不能指望每个ISA内的行或字段分隔符是相同的。

另一件事......对于edi文件,也可能(再次,不确定它的规格)是否具有可变长度ISA。这是非常罕见的,但我必须适应它。如果发生这种情况,您必须将该行解析为其字段。 ISA中的最后一个字段只有一个字符长,因此您可以从中确定ISA的实际长度。如果是我,我不会担心这个,除非你看到这样的文件。这是一种罕见的现象。

什么我上面说可能不是以“规范”的信......也就是说,我不知道它的法律有在同一个文件不同的行分隔符,但在不同ISA,但它在技​​术上是可行的,我适应它,因为我必须处理以这种方式出现的文件。 edi处理器我每天使用超过3000个可能的数据源来处理超过5000个文件(所以我看到很多奇怪的东西)。

最好的问候, 别

答案 1 :(得分: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]); }
}

?>

希望这有助于您入门。

答案 2 :(得分:0)

对于标题信息,以下java将让您轻松获得基本信息。 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 ...