[Regex] Pfadangabe entfernen

amn.ssy

Erfahrenes Mitglied
Hallo,

nach dem ich schon den ganzen Vormittag hoch und runter gegooglet habe und auch der Regex-Tester nicht weiter geholfen hat versuche ich es nochmal hier.
Via Regex soll bestimmte Teile aus einem String entfernt werden.
Für ein paar einfache Fälle funktioniert das ganz gut, hier wirds nun doch etwas spezieller.
Was ich benötige ich nur den Ausdruck selbst - wie ich das dann verbaue bzw. ein replace hinbekomme weiß ich (denke ich)

Ausgangsdatei:
c:\pfad\pfad2\ab123.txt;abcd12efg
c:\pfad\pfad2\ab123.txt;abcd12fgh:1of2
c:\pfad\pfad2\ab123.txt;abcd12efg
c:\pfad\pfad2\ab123.txt;abcd12fgh:2of2
c:\pfad\pfad2\ab142.txt;abcd12eff
c:\pfad\pfad2\ab142.txt;abcd12fgh:1of2
c:\pfad\pfad2\ab142.txt;abcd12efgff
c:\pfad\pfad2\ab142.txt;abcd12fgh:2of2
c:\pfad\pfad2\ab266.txt;bcd.12.efg
c:\pfad\pfad2\ab266.txt;bcd 12fgh:1of2
c:\pfad\pfad2\ab266.txt;bcde12
c:\pfad\pfad2\ab266.txt;abcd12fgh:2of2

Ziel:
ab123.txt;abcd12
ab142.txt;abcd12
ab266.txt;bcd12

LG
_opiwahn_
 
Ist immer die 12 das Ende des Strings? Oder woran erkennt man wenn der String endet?
 
Hallo Yaslaw,

neben dem Dateinamen ohne Pfad (kann in der Länge variabel sein und endet difinitiv mit einem \ :) )benötige ich nach dem Semikolon die ersten 5 Zeichen und direkt dahinter die erste Ziffernfolge (sind i.d.R. 2 bzw. max. 3 Zahlen). Was nach diesen Zahlen kommt kann ebenfalls weg. Der String muß mit diesen 2 bzw. 3 Zahlen enden.

Die erste bereinigung mache ich mit diesem VBS:

Code:
InFile = WScript.Arguments(0)
OutFile = WScript.Arguments(1)

Set fso = CreateObject("Scripting.FileSystemObject")

If fso.GetFile(InFile).Size = 0 Then
    fso.CreateTextFile(OutFile)
    WScript.Quit
End If

T = fso.OpenTextFile(WScript.Arguments(0)).ReadAll

'T = Right(T, (LEN(T) -26)
'T = MID(T, 27, 35)

With New RegExp

	.Global = True
	.IgnoreCase = True
	.Multiline = True
    	
	
    .Pattern = "[. ]{2,}"
    T = .Replace(T, " ")

    .Pattern = "( | :|,|;|Text|01|Name of|Product|Page)"
    T = .Replace(T, "")

    .Pattern = "[:]{2,}"
    T = .Replace(T, ";")

End With

fso.CreateTextFile(WScript.Arguments(1), True).Write(T)

Gruß
_opiwahn_
 
Zuletzt bearbeitet von einem Moderator:
Wenn man den Pfad schon mal vornweg entfernt wirds einfacher
Visual Basic:
    txt = "c:\pfad\pfad2\ab266.txt;abcd12fgh:2of2"
    
    'Pfad entfernen: Nimm alles am Ende des Strings was kein \ ist.
    RegExp.Pattern = "^.*\\([^\\]+)$"
    txt = RegExp.Replace(txt, "$1")
    
    'Von Anfang an alles nehmen was kein ; ist. Dann ein ; Dann Alles was keine Ziffer ist. Dann noch die folgenden Ziffern
    RegExp.Pattern = "^([^;]+;[^\d]+[\d]+).*$"
    txt = RegExp.Replace(txt, "$1")
    
    'txt: ab266.txt;abcd12
 
Hallo Yaslaw,

Vielen Dank, der erste Teil funktioniert super!
Es bleiben vor dem ; nur noch die Dateinamen korrekt stehen.
Im hinteren Teil tut sich leider nichts(?)

Hier mal ein kurzer Ausschnitt (vom Original)

<code>
184838D_AdoOCR.txt;RYTMONORM150MGFTTW50
184838D_AdoOCR.txt;RYTMONORM150MGFILMTABLETTEN:1of2
184838D_AdoOCR.txt;RYTMONORM150MGFTTW50
184838D_AdoOCR.txt;RYTMONORM150MGFILMTABLETTEN:2of2
185058D_AdoOCR.txt;RYTMONORM150MGFTES60
185058D_AdoOCR.txt;RYTMONORM150MGFILMTABLETTEN:1of2
185058D_AdoOCR.txt;RYTMONORM150MGFTES60
185058D_AdoOCR.txt;RYTMONORM150MGFILMTABLETTEN:2of2
18561_AdoOCR.txt;FENOBIOGARAN.M.67MG.60GEL.MV.FR
18561_AdoOCR.txt;FENOBIOGARAN.M.67MG.60GEL.MV.FR
18561_AdoOCR.txt;FENOBIOGARAN.M.67MG.60GEL.MV.FR
18565_AdoOCR.txt;LIPANTHYL.M.67MG.60GEL.MV.FR
18565_AdoOCR.txt;LIPANTHYL.M.67MG.60GEL.MV.FR
18565_AdoOCR.txt;LIPANTHYL.M.67MG.60GEL.MV.FR
</code>

Was ich benötige sieht etwa so aus

<code>
184838D_AdoOCR.txt;RYTMO150
18561_AdoOCR.txt;FENO67
</code>

LG
_opiwahn_
 
Ah, os war das mit den 5 Buchstaben gemeint.
Visual Basic:
    RegExp.Pattern = "^([^;]+;[^\d]{1,5})[^\d]*([\d]+).*$"
    txt = RegExp.Replace(txt, "$1$2")

Meine Tests
Code:
184838D_AdoOCR.txt;RYTMONORM150MGFILMTABLETTEN:1of2 -> 184838D_AdoOCR.txt;RYTMO150 
18561_AdoOCR.txt;FENOBIOGARAN.M.67MG.60GEL.MV.FR -> 18561_AdoOCR.txt;FENOB67
18565_AdoOCR.txt;LIPANTHYL.M.67MG.60GEL.MV.FR -> 18565_AdoOCR.txt;LIPAN67

Wobei ich nicht sehe warum du '18561_AdoOCR.txt;FENO67' bekommst anstelle von '18561_AdoOCR.txt;FENOB67'. Du willst ja die ersten 5 Buchstaben nach dem ; haben.
 
Hallo Yaslaw,

das klappt super, vielen Dank.
Dein erste Vorschlag ging im übrigen auch schon in die richtige Richtung, ich hatte den Pattern nur an der falschen Stelle platziert. Natürlich muß der am Schluß sitzen.
Ansonsten habe ich die Anzahl der ersten Buchstaben auf 4 Reduziert, da dies fer kleinste gemeinsame Nenner ist.
Im Prinzip handelt es sich hier nur um 2 Produkte die z.T. aber unterschiedliche Namen haben können.
Allein für "Feno" könnte ich dann noch 3 Fässer auf machen (FENOF, FENOB, FENOG).
Daher habe ich beschlossen, daß auch die ersten 4 Buchstaben und die 2 bzw. 3 Ziffern zur Identifkation ausreichen.
Ich hatte daher auch gerade versucht einen Quantifizierer einzubauen {2,3}.
Das kommt daher, daß es eben die 2 bzw. 3 Ziffen, die unmittelbar zusammenhängen sein müßen.
Hat aber leider nicht viel gebracht. An welcher Stelle muß ich den platzieren?
Ich habe sporadisch (liegt an der OCR) auch sowas
Code:
19334_AdoOCR.txt;FENOBIOGARANt-167
was dann zu
Code:
19334_AdoOCR.txt;FENO167
führt.
Die Ziffern die angehängt werden müssen (im beispiel 67 oder 150) liegen zum Glück immer zusammen und es sind grundsätzlich immer min. 2 und max. 3. Daher die Idee mit {2,3}.
Wenn später weitere "Produkte" hinzugefügt werden, können noch andere Zahlen wie 167,200,267,300,... hinzukommen.
Ups, ich sehe gerade, daß 167 auch ne Zahl mit drei Ziffern ist :-(
Diese Zahl könnte später auch noch dazu kommen, ist jetzt aber noch nicht vorhanden.

Sowas muß ich dann entweder händisch fixen und kann das Ganze nicht komplett automatisch durchlaufen lassen oder FENO167 implementieren oder hoffen, daß sich soetwas dann in Luft auflöst wenn die doppelten Zeilen erstmal draußen sind. Die Voraussetzungen hierfür sind ja nun auch geschaffen :)

Gruß
opiwahn

P.S. da ich es ja auch verstehen möchte:
Code:
"^([^;]+;[^\d]{1,4})[^\d]*([\d]+).*$"
Kannst du mir den mal erklären?
Soweit ich weiß steht \d für Digits, ^ für am Anfang der Zeichenkette, mit dem was zw. den beiden () steht hast du zwei Gruppen gebildet - oder?
Wieso wirkt sich aber {1,4} auf die Buchstaben aus und was machen die beiden ; wenn im ganzen String doch nur eins ist?
Wie gesagt ich würds gerne verstehen.
 
Zuletzt bearbeitet:
Update:
Das 167er Problem konnte ich z.T. mit dem Zusatz "t-1" eleminieren.
Code:
    .Pattern = "( | :|,|;|Text|01|Name of|Product|Page|t-1)"
    T = .Replace(T, "")
An einer einzigen Stelle (eher unwichtig, versaut aber das löschen der Doppelten) hab ich noch sowas: LIPANTHYL. 1. 67
Mit "|1." im Pattern oben bekomme ich das nicht raus bzw. es wirkt sich auf alle 1er aus und löscht diese gleich mit
 
[^\d]{1,4}
1 bis 4 Zeichen die keine Ziffern sind. Also Buchsteben, Satzzeichen Leerzeichen etc. sind erlaubt.

^am Anfang eines Patterns bedeutet Stringanfang. Das^ innerhalb einer [] gefolgt von einem Zeichen bedeutet Alles ausser das Zeichen. [^A] Bedeutet also alles ausser ein A.

Den Rest habe ich jetzt ehrlich gesagt nicht verstanden.
 
Hallo Yaslaw,

danke für deine erhellenden Worte :)
Hab in den vergangenen Tagen ein wenig auf "Regexe.com" experimentiert um mir das noch mal zu verdeutlichen.
Dabei hab ich mir ein Pattern zusammen gebaut, der mit einer kleinen Ausnahme schon fast die Eierlegendewollmichsau ist. Mit nur einer einzigen Zeile werden 2-3 andere überflüßig.
Jedoch funktioniert er nur auf dieser Plattform, aber nicht wie gewünscht im VBS. Das wird wohl eine neue Anfrage werden ... ;-)

Gruß
_opiwahn_
 
Zuletzt bearbeitet:

Neue Beiträge

Zurück