繁体   English   中英

读取EDI格式化文件

[英]Reading EDI Formatted Files

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

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

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

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

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

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

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

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

最好的问候,不要

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]); }
}

?>

希望这有助于您入门。

对于标题信息,以下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 ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM