2010-01-22 5 views
11

Je suis nouveau à l'EDI et j'ai une question.Lecture de fichiers formatés EDI

J'ai lu que vous pouvez obtenir la plupart de ce dont vous avez besoin à propos d'un format EDI en regardant les 3 derniers caractères de la ligne ISA. C'est très bien si chaque EDI utilisait des sauts de ligne pour séparer des entités, mais j'ai trouvé que beaucoup sont des fichiers à ligne unique avec un nombre quelconque de caractères utilisés comme des sauts. J'ai remarqué que le dernier caractère de chaque EDI que j'ai analysé est le caractère de rupture. J'ai regardé quelques centaines, et n'ai trouvé aucune exception à ceci. Si je prends ce caractère pour la première fois et que je l'utilise pour obtenir les trois dernières lignes de l'ISA, devrais-je raisonnablement m'attendre à pouvoir analyser les données d'un EDI? Je ne sais pas si cela aide, mais les 'types' EDI en question ont tendance à être 850, 875. Je ne suis pas sûr que ce soit une norme ou non, mais il peut être utile de mentionner.

+1

EDI en 2010? Je pensais que XML est juste un peu plus facile de travailler avec –

+6

90% des revenus proviennent de l'EDI. Walmart, Target, Toys R Us et d'autres grands détaillants représentent 50% de ce chiffre. Nous n'utilisons pas l'EDI parce que nous l'aimons, nous l'utilisons parce que nos clients le font. Cela ne vaut pas le temps et l'argent pour ces grands détaillants de changer de format, parce que cela fonctionne. – Brandon

+1

Quand je dis 90% du chiffre d'affaires, j'espère qu'il était compris que je voulais dire 90% du chiffre d'affaires de mon entreprise. – Brandon

Répondre

14

le type de transaction d'edi n'a pas vraiment d'importance (850 = commande, 875 = épicerie po). Ayant écrit quelques analyseurs d'EDI, voici quelques choses que j'ai trouvé:

Vous devriez pouvoir compter sur l'ISA (et l'ISA seulement) en largeur fixe (105 caractères si la mémoire est utilisée). supprime les 105 premiers caractères. tout ce qui suit et avant la première occurrence de "GS" est votre terminateur de ligne (cela peut être n'importe quoi, inclure un 0x07 - le bip - alors attention si vous sortez en stdout pour le débogage ou vous pouvez avoir un tas de bips hors de l'orateur). normalement c'est 1 ou 2 caractères, parfois cela peut être plus (si la personne vous envoyant les données ajoute un terminateur supplémentaire pour une raison quelconque). Une fois que vous avez le terminateur de ligne, vous pouvez obtenir le délimiteur de segment (champ). Je tire normalement les 3 caractères de la ligne GS et je l'utilise, même si le 4ème caractère de la ligne ISA devrait aussi fonctionner.

également être conscient que vous pouvez obtenir un fichier avec plusieurs ISA dedans. Dans ce cas, ne peut pas compter sur la ligne ou les séparateurs de champ étant les mêmes dans chaque ISA.

autre chose .. il est également possible (encore une fois, pas sûr si sa spécification) pour un fichier edi d'avoir une longueur ISA variable. C'est très rare, mais j'ai dû l'accommoder. si cela arrive, vous devez analyser la ligne dans ses champs. Le dernier champ de l'ISA n'est qu'un long caractère, vous pouvez donc déterminer la longueur réelle de l'ISA. Si c'était moi, je ne m'inquiéterais pas à moins de voir un fichier comme ça. c'est une occurance rare. Ce que j'ai dit ci-dessus peut ne pas être à la lettre du "spec" ... c'est-à-dire, je ne suis pas sûr qu'il est légal d'avoir différents séparateurs de ligne dans le même fichier, mais dans différents ISA, mais c'est techniquement possible et je l'accepte parce que je dois traiter les fichiers qui arrivent de cette façon. le processeur edi j'utilise des processus de plus de 5000 fichiers par jour avec plus de 3000 sources de données possibles (donc je vois beaucoup de trucs bizarres).

meilleures salutations, don

+0

Don, c'était une bonne réponse. Je me suis dit que je pouvais compter sur le dernier caractère du fichier pour être le terminateur de ligne, mais cela ne serait vrai que si un seul ISA est utilisé, et même dans ce cas, il ne prend pas en charge les situations où plus de 1 caractère est utilisé. un terminateur de ligne. Je n'ai pas vu plus d'un ISA par EDI où je travaille, ni rien sur un seul caractère comme terminateur de ligne, mais je pourrais tout aussi bien y être préparé. – Brandon

+1

Soyez prudent avec ça. Je vois beaucoup de fichiers où les gens mettent un caractère supplémentaire ou deux après le terminateur de ligne ... généralement un null ou deux (0x00). ce que je fais est d'abord normaliser les terminaisons de ligne dans le fichier - c'est réécrire le fichier avec 0x0D/0x0A comme terminateur de ligne. Je le fais parce qu'il rend le fichier facile à lire dans un éditeur de texte. alors je passe par le dossier et m'assure que pour chaque ISA il y a un IEA correspondant. S'il y a des données supplémentaires après l'IEA, je le rejette habituellement. si les données après IEA commencent avec ISAt cela signifie une transmission partielle (condition d'erreur). –

+0

oups, je voulais dire "un caractère supplémentaire ou deux après le LAST line terminator" ... à la fin du fichier. –

0

contenu EDI est composé de segments et éléments.

Pour l'analyse syntaxique, vous devez diviser en segments d'abord, puis des éléments comme si (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]); } 
} 

?> 

Hope this helps à démarrer.

0

Pour les informations d'en-tête, le java suivant vous permettra d'obtenir les informations de base assez facilement. C# a la scission aussi bien et le code est très similaire

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