2016-06-02 7 views
1

Ich habe ein Problem beim Abrufen des Lieferdatums aus TXT-Datei gesendet mit EDI.Wie lese ich das Lieferdatum aus Edifact d96a .txt-Datei?

Meine Kunden haben Gelegenheit, die Linie in eine .txt-Datei zu setzen:

DTM + 76: 20.160.702: 102

, wenn sie etwas von der Website bestellen Lieferung zu setzen Datum für zukünftige Lieferungen.

Ich möchte das Datum (in diesem Fall 2016-07-02) und setzen Sie es auf die Lieferdatum-Variable (und setzen Sie es dann in der Datenbank).

Ich denke darüber nach, Scanner in Java zu verwenden, um festzustellen, ob die Datei den Text "DTM: 76" enthält, und dann den Datumsteil der Zeile wie Find a string (or a line) in a txt File Java zu lesen. Ist es möglich/effektiv mit EDI oder gibt es einen besseren Weg, dies zu tun?

Die beste Lösung wäre für mich so etwas wie dieses:

if (DTM+76:YYYYMMDD::102 exists) 
      { 
       //set the deliveryDate by getting only YYYYMMDD from DTM:76:20160702:102 
       deliveryDate= get..("20160702"); 
      } 

Info über EDI und Liefertermine: http://www.gs1.org/sites/default/files/docs/eancom/ean02s4/part2/insdes/053.htm https://www.stylusstudio.com/edifact/D96A/ORDERS.htm

Irgendwelche Vorschläge?

+1

Ich empfehle, 'Smooks' oder' EDIReader' zu verwenden, die Bibliotheken analysieren. – Stavr00

Antwort

1

Wenn wir EDIFACTs analysieren, teilen wir die EDIFACT in Segmente, dann Elemente, dann Komponenten wie so mit regulären Ausdrücken:

String edi = "UNH+..."; // full edifact as string here 

// split EDIFACT string into segments 
String[] segments = edi.split("(?<!\?)'"); 

// loop through segments to find one beginning with DTM+ 
// lets assume its 3rd segment in array 
String dtmSegment = segments[2]; 

// split DTM segment to get its elements 
String[] dtmElements = dtmSegment.split("(?<!\?)\+"); 

// get date, time, period element 
String dtmElement = dtmElements[1]; 

// split dtmElement to get date/time/period components 
String[] dtmComponents = dtmElement.split("(?<!\?):"); 

// get date/time/period component value 
String deliveryDate = dtmComponents[1]; 

Hinweis: dass, wenn die volle EDIFACT in Segmente aufgeteilt, die Segmenttrennzeichen ' wird aus jedem Segment String entfernt. Gleiches gilt für das Aufteilen von Elementen und Komponenten in einzelne Strings.

+0

Was meinst du mit voller edifact als String hier? Ich erhalte das Edifact als .txt-Datei in einem Ordner via ftp –

+1

In Ihrem Fall würden Sie den Inhalt der .txt Datei in die 'edi' String Variable parsen, die Sie dann mit' .split() 'on machen würden. –

1

Ich würde vorschlagen, Mustererkennung mit Regex zu verwenden, um für das Auftreten einer gültigen Zeile, d. H. DTM + 76: gefolgt von einem gültigen Datumsformat.

See jdoc:

https://docs.oracle.com/javase/7/docs/api/java/util/regex/Pattern.html

Wenn nun ein Spiel Sie leicht das Datum Teil des Spiels erhalten gefunden wird (Hinter dem: char) dann zu DB hinzufügen.

Verwandte Themen