ozean
Goto Top

EAN-Nummern aus INVRPT auslesen und in einer Excel-Datei speichern

Hallo zusammen,

ich habe eine gemischte EDI-Datei, in welcher Sales-Reports (SLSRPT) und Inventur-Reports (INVRPT) aufgeführt sind.

Ich muss aus dieser Datei (im ersten Schritt) alle EANs (eigentlich eine Nummer, welche immer mit 4 beginnt und 13 Stellen hat) auslesen und in einer separaten Datei (z.B. Excel) abspeichern, aber eigentlich aus den Textblöcken, welche zu INVRPT gehören.
Ich kann natürlich alle Text-Blöcke manuell entfernen, welche zu SLSRPT gehören.

Gibt es irgendeine Anwendung oder Script, welche(s) mir bei der Lösung des Problems helfen kann?

Als Programmierer bin leider ein absoluter Laie, das ich mir ein Script schreiben kann.

Vielen Dank!

Content-Key: 201739

Url: https://administrator.de/contentid/201739

Printed on: April 25, 2024 at 09:04 o'clock

Member: rubberman
rubberman Feb 16, 2013 at 12:10:36 (UTC)
Goto Top
Hallo ozean.

Als Programmierer bin leider ein absoluter Laie ...

Hmm, ich bin als EDI-Dateien-Interpretierer absoluter Laie.
Also musst du jemanden finden der sich sowohl mit Programmieren auskennt, als auch detailliert weiß wie deine EDI Dateien aufgebaut sind. Andere Möglichkeit wäre ja vielleicht, wenn du so eine Datei mal beispielhaft hier ... naja egal.

Grüße
rubberman
Member: ozean
ozean Feb 17, 2013 updated at 20:41:40 (UTC)
Goto Top
Hallo rubberman,

eigentlich ist die Interpretation einer EDI-Datei eine Nebensache. Vielmehr geht es darum, aus einer Textdatei eine Variable auszulesen, welche mit 4 beginnt und 13 Stellen hat. Hier ist ein Auszug aus dieser Datei:

UNB+UNOC:3+4399902140089:14+4009796000009:14+130201:0948+47431844'
UNH+1+INVRPT:D:96A:UN:EAN004'
BGM+35+1660+9'
DTM+137:20110425:102'
DTM+366:20110425:102'
DTM+194:20110425:102'
DTM+206:20110425:102'
NAD+BY+4399902140089::9'
NAD+SU+4009796000009::9'
NAD+SN+4399902140089::9'
LIN+1++4009796076059:EN'
QTY+145:1'
LIN+2++4009796076066:EN'
QTY+145:1'
LIN+3++4009796076073:EN'
QTY+145:1'
LIN+4++4009796076172:EN'
QTY+145:1'
UNT+102+1'
UNZ+1+47431844'
UNA:+.? '


Auffällig ist, dass diese Nummern immer nach dem "+" beginnen und vor dem ":" enden.
Die Frage ist, was wenn nach dem Plus-Zeichen eine 4 steiht, aber keine 13 Stellen hat und keine EAN ist?

Wie dem auch sei... Tatsache ist, ich habe eine Textdatei mit oben genanntem Inhalt. Als Ergebnis sollte eine neue Textdatei sein, in welcher nur die EAN's stehen:

4399902140089
4009796000009
4399902140089
4009796000009
4399902140089
4009796076059
4009796076066
4009796076073
4009796076172

Über die doppelte Einträge muss man sich keine Gedanken machen, die könnte man im Excel schnell aussortieren.

Wie kann man so was realisieren?

Gruß
Ozean
Member: rubberman
rubberman Feb 17, 2013 updated at 21:41:30 (UTC)
Goto Top
Hallo ozean.

So etwas realisiert man üblicherweise mit Regulären Ausdrücken.
Angenommen deine Ausgangsdatei heißt "test.txt", geschrieben werden soll in "neu.txt" - Folgendes VBScript sollte es tun:

*.vbs
Option Explicit

Const sInFile = "test.txt"  
Const sOutFile = "neu.txt"  

Dim oRegex, oFSO, oFile, colMatches, oMatch, sContent

Set oRegex = New RegExp
oRegex.Global = True
oRegex.Pattern = "\+4\d{12}:"  

Set oFSO = CreateObject("Scripting.FileSystemObject")  
sContent = oFSO.OpenTextFile(sInFile).ReadAll
Set oFile = oFSO.OpenTextFile(sOutFile, 2, True)
If oRegex.Test(sContent) Then
  Set colMatches = oRegex.Execute(sContent)
  For Each oMatch In colMatches
    oFile.WriteLine Mid(oMatch.Value, 2, 13)
  Next
End If
oFile.Close

Set oFile = Nothing
Set oMatch = Nothing
Set colMatches = Nothing
Set oFSO = Nothing
Set oRegex = Nothing

Grüße
rubberman
Member: ozean
ozean Feb 18, 2013 at 09:07:20 (UTC)
Goto Top
Hallo rubberman,

du bist echt super! Mein Respekt!
Funktioniert wunderbar.

Ich hätte so was selbst gar nicht geschafft.

dürfte ich dich noch was fragen?

ich habe mir überlegt, ob es evtl. besser wäre, die doppelten einträge gleich in den Script zu integrieren.
Dazu habe ich einen Ausschnitt hier im Forum gefunden, welcher genau das machen soll:

Ein = "D:\Datei.txt"
Aus = "D:\Unikate.txt"

Set fso = CreateObject("Scripting.FileSystemObject")
Set d = CreateObject("Scripting.Dictionary")

ZeilenEin = Split(fso.OpenTextFile(Ein).ReadAll, vbCrLf)
For Each Zeile In ZeilenEin
If Not d.Exists(Zeile) Then d.Add Zeile, Dummy
Next

fso.CreateTextFile(Aus).Write Join(d.Keys, vbCrLf)

Ich habe das am Ende deines Scripts eingefügt und die Dateinamen angepasst, wobei als "Ein" die neuerstellte neu.txt und als "Aus" die EAN.txt eingegeben habe.

Das heißt, die neu.txt wäre als temporäre Datei.
Aber das hat nicht funktioniert. Wahrscheinlich müsste ich noch irgendwelche Variablen definieren.

die temporäre Datei soll am Ende auch gelöscht werden.

Köntest du mir sagen, wie ich diesen Ausschnitt in dein Script integriere und die temporäre Datei lösche?

Danke!
Member: rubberman
rubberman Feb 18, 2013 updated at 16:42:31 (UTC)
Goto Top
Hallo ozean.

Eine temporäre Datei ist nicht nötig. Das geht genauso on the fly.
Option Explicit

Const sInFile = "test.txt"  
Const sOutFile = "EAN.txt"  

Dim oRegex, oFSO, oDict, oFile, colMatches, oMatch, sContent, sEan

Set oRegex = New RegExp
oRegex.Global = True
oRegex.Pattern = "\+4\d{12}:"  

Set oFSO = CreateObject("Scripting.FileSystemObject")  
sContent = oFSO.OpenTextFile(sInFile).ReadAll
Set oDict = CreateObject("Scripting.Dictionary")  
If oRegex.Test(sContent) Then
  Set colMatches = oRegex.Execute(sContent)
  For Each oMatch In colMatches
    sEan = Mid(oMatch.Value, 2, 13)
    If Not oDict.Exists(sEan) Then oDict.Add sEan, vbNullString
  Next
End If
Set oFile = oFSO.OpenTextFile(sOutFile, 2, True)
oFile.Write Join(oDict.Keys, vbCrLf)
oFile.Close

Set oFile = Nothing
Set oDict = Nothing
Set oMatch = Nothing
Set colMatches = Nothing
Set oFSO = Nothing
Set oRegex = Nothing
Falls nötig, darf sInFile = sOutFile sein face-wink

Grüße
rubberman
Member: ozean
ozean Feb 19, 2013 at 11:13:13 (UTC)
Goto Top
Hallo rubberman,

ich danke dir ganz herzlich! Du hast mir sehr geholfen.
Das Script funktioniert 1A!!!