Чтение файлов с форматированием 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 ...