Чтение файлов в формате EDI
Я новичок в EDI, и у меня есть вопрос.
Я прочитал, что вы можете получить большую часть того, что вам нужно в формате EDI, посмотрев на последние 3 символа строки ISA. Это нормально, если в каждом EDI используются разрывы строк для отдельных объектов, но я обнаружил, что многие из них представляют собой однострочные файлы с любым количеством символов, используемых в качестве разрывов. Я заметил, что ОЧЕНЬ последний символ в каждом EDI, который я проанализировал, является символом прерывания. Я посмотрел несколько сотен и не нашел исключений из этого. Если я сначала возьму этот символ и использую его для получения последних 3 строк ISA, должен ли я разумно ожидать, что смогу анализировать данные из EDI?
Я не знаю, помогает ли это, но рассматриваемые типы EDI имеют тенденцию быть 850, 875. Я не уверен, является ли это стандартом или нет, но, возможно, стоит упомянуть.
3 ответа
Тип транзакции 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 возможных источников данных (поэтому я вижу много странных вещей).
С наилучшими пожеланиями, Дон
Для информации заголовка следующий 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 ...
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]); }
}
?>
Надеюсь, это поможет вам начать.