2010-01-22 16 views
11

Soy nuevo en EDI, y tengo una pregunta.Lectura de archivos con formato EDI

He leído que puede obtener la mayoría de lo que necesita sobre un formato EDI mirando los últimos 3 caracteres de la línea ISA. Esto está bien si cada EDI usó saltos de línea para separar entidades, pero he encontrado que muchos son archivos de una sola línea con cualquier número de caracteres utilizados como saltos. Me he dado cuenta de que el VERY último personaje en cada EDI que he analizado es el carácter de ruptura. Miré unos cientos y no he encontrado excepciones a esto. Si tomo por primera vez ese personaje, y lo uso para obtener los últimos 3 de la línea ISA, ¿debería razonablemente esperar que pueda analizar los datos de un EDI?

No sé si esto ayuda, pero los 'tipos' de EDI en cuestión tienden a ser 850, 875. No estoy seguro de si eso es un estándar o no, pero puede valer la pena mencionarlo.

+1

EDI en 2010? Pensé que XML es un poco más fácil de trabajar con –

+6

El 90% de los ingresos provienen de EDI. Walmart, Target, Toys R Us y otros grandes minoristas representan el 50% de eso. No usamos EDI porque nos gusta, lo usamos porque nuestros clientes sí lo hacen. No vale la pena el tiempo/dinero para que cualquiera de estos grandes minoristas cambie a otro formato, porque funciona. – Brandon

+1

Cuando digo el 90% de los ingresos, espero que se haya entendido que me refería al 90% de los ingresos de mi empresa. – Brandon

Respuesta

14

el tipo de transacción de edi realmente no importa (850 = orden, 875 = abarrotes po). Después de haber escrito algunos analizadores edi, aquí hay algunas cosas que he encontrado:

debe poder contar con el ISA (y el ISA solamente) de ancho fijo (105 caracteres si la memoria sirve). quita los primeros 105 caracteres. todo después de eso y antes de la primera aparición de "GS" es su terminador de línea (esto puede ser cualquier cosa, incluya un 0x07 - el pitido) así que tenga cuidado si está produciendo stdout para la depuración o puede tener un montón de pitidos fuera del altavoz). normalmente esto es 1 o 2 caracteres, a veces puede ser más (si la persona que le envía los datos agrega un terminador adicional por alguna razón). una vez que tenga el terminador de línea, puede obtener el delimitador de segmento (campo). normalmente saco los 3 caracteres de la línea GS y los uso, aunque el 4º personaje de la línea ISA debería funcionar también.

también tenga en cuenta que puede obtener un archivo con múltiples ISA. en ese caso, no puede contar con que los separadores de línea o campo son los mismos dentro de cada ISA.

otra cosa ... también es posible (nuevamente, no estoy seguro de si es la especificación) que un archivo edi tenga un ISA de longitud variable. esto es muy raro, pero tuve que acomodarlo. si eso sucede, debes analizar la línea en sus campos. el último campo en el ISA es solo un carácter largo, por lo que puede determinar la longitud real del ISA a partir de él. si fuera yo, no me preocuparía a menos que veas un archivo como este. es una rara ocurrencia.

Lo que he dicho anteriormente puede no corresponder a la letra de la "especificación" ... es decir, no estoy seguro de que sea legal tener diferentes separadores de línea en el mismo archivo, pero en diferentes ISA, pero es técnicamente posible y lo acomodo porque tengo que procesar los archivos que vienen de esa manera. el procesador edi utilizo procesos de más de 5000 archivos al día con más de 3000 posibles fuentes de datos (por lo que veo muchas cosas raras).

mejores cordiales, don

+0

Don, esa fue una gran respuesta. Pensé que podía contar con el último carácter del archivo como mi terminador de línea, pero eso solo sería cierto si se usa un único ISA, y aun así, no se adapta a las situaciones en las que se utiliza más de 1 carácter como un terminador de línea. No he visto más de un ISA por EDI donde trabajo, ni nada sobre un solo carácter como terminador de línea, pero podría estar preparado para ello. – Brandon

+1

ten cuidado con eso. Veo una gran cantidad de archivos donde las personas ponen un carácter extra o dos después del terminador de línea ... generalmente nulo o dos (0x00). Lo que hago es primero normalizar los terminadores de línea en el archivo, es decir, volver a escribir el archivo con 0x0D/0x0A como terminador de línea. Lo hago porque hace que el archivo sea fácil de leer en un editor de texto. luego reviso el archivo y me aseguro de que para cada ISA haya un IEA coincidente. si hay datos adicionales después de la IEA, generalmente lo descarto. si los datos después de IEA comienzan con ISAt eso significa que es una transmisión parcial (condición de error). –

+0

Vaya, quise decir "un carácter extra o dos después del terminador de la ÚLTIMA línea" ... al final del archivo. –

0

contenido EDI se compone de segmentos y elementos.

analizarlo, tendrá que dividirla en segmentos primero, y luego los elementos como tal (en 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]); } 
} 

?> 

Espero que esto ayude a comenzar.

0

Para información del encabezado, la siguiente información de Java le permitirá obtener la información básica bastante fácil. C# tiene la división también y el código se ve muy similar

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