Чтение файлов в формате EDI - PullRequest
12 голосов
/ 22 января 2010

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

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

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

Ответы [ 3 ]

14 голосов
/ 22 января 2010

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

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

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

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

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

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

0 голосов
/ 23 сентября 2016

Для информации заголовка следующий 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 ...
0 голосов
/ 02 декабря 2014

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

?>

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

...