Чтение файлов с форматированием EDI

Я новичок в EDI, и у меня есть вопрос.

Я прочитал, что вы можете получить большую часть того, что вам нужно в формате EDI, просмотрев последние 3 символа строки ISA. Это нормально, если каждая используемая линия EDI разбивается на отдельные объекты, но я обнаружил, что многие из них являются однострочными файлами с любым количеством символов, используемых в качестве разрывов. Я заметил, что ОЧЕНЬ последний символ в каждом анализируемом EDI - это символ прерывания. Я посмотрел несколько сотен и не нашел никаких исключений. Если я сначала возьму этот символ и воспользуюсь этим, чтобы получить последние 3 строки ISA, должен ли я разумно ожидать, что я смогу проанализировать данные из EDI?

Я не знаю, помогает ли это, но типы типов EDI, как правило, составляют 850, 875. Я не уверен, является ли это стандартом или нет, но, возможно, стоит упомянуть.

Ответ 1

тип транзакции edi на самом деле не имеет значения (850 = order, 875 = продуктовый po). написав несколько эди-парсеров, вот несколько вещей, которые я нашел:

вы должны быть в состоянии рассчитывать на ISA (и только ISA) фиксированную ширину (105 символов, если используется память). снять первые 105 символов. все после этого и до первого появления "GS" - это ваш терминатор линии (это может быть что угодно, включая 0x07 - звуковой сигнал - так что следите, если вы выводите на стандартный вывод для отладки или у вас может появиться множество звуковых сигналов из спикера). обычно это 1 или 2 символа, иногда это может быть больше (если человек, отправляющий вам данные, по какой-то причине добавляет дополнительный терминатор). как только у вас есть терминатор линии, вы можете получить разделитель сегмента (поля). я обычно вытягиваю 3 символа линии GS и использую это, хотя 4-й символ линии ISA также должен работать.

также помните, что вы можете получить файл с несколькими ISA в нем. в этом случае вы не можете рассчитывать на то, что разделители строк или полей будут одинаковыми в каждой ISA.

другое дело. Также возможно (опять же, не уверен, что его спецификация) для файла edi имеет переменную длину ISA. это очень редко, но я должен был его разместить. если это произойдет, вам нужно проанализировать строку в своих полях. последнее поле в ISA является только символом длинным, поэтому вы можете определить реальную длину ISA. если бы это был я, я бы не стал беспокоиться об этом, если вы не увидите такой файл. это редкое явление.

то, что я сказал выше, может быть не в букве "spec"... то есть я не уверен, что его законно иметь разные разделители строк в одном файле, но в разных ISA, но это технически возможно, и я его приспосабливаю, потому что мне приходится обрабатывать файлы, которые проходят таким образом. в edi-процессоре я использую процессы более 5000 файлов в день с более чем 3000 возможными источниками данных (поэтому я вижу много странных вещей).

С наилучшими пожеланиями, дон

Ответ 2

Содержимое 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]); }
}

?>

Надеюсь, это поможет вам начать работу.

Ответ 3

Для информации заголовка следующая java позволит вам получить основную информацию довольно легко. С# также имеет разделение, и код выглядит очень похожим

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 ...