Werte über Reguläre Ausdrücke ausgeben VB Script
Guten Tag,
ich hab mich an Regulären Ausdrücken und Scripten versucht, komme aber nicht weiter...........
Jeder Beitrag hier hilft mir weiter mich in die Materie einzuarbeiten
Hallo Zusammen,
die Aufgabenstellung wäre folgende : Aus einer XML alle Werte die mit einem REG-Ausdruck übereinstimmen auszugeben.
Ich teste mit dem SystemScripter rum daher der Test zunächst nur über eine Ausgabe und nicht als Export in eine andere Datei.
Er findet die gesuchten Gesamtstrings und zeigt mir die betroffenen Zeilen mit Wscript.Echo auch an.
D.H. die Suche durch die ganze Datei klappt soweit, ich erhalte die richtigen Zeilen.
Jetzt brauche ich aber nur die im regulären Ausdruck mit () gematchten Werte und zwar genau die 4 die ich haben will
Wie ändere ich zunächst den WScript.Echo Befehl um die benötigten Werte auszugeben.
Bisher 123456 VO blablabla 0,00 blablabla 123,00
gebraucht wird (123456) (VO) (0,00) (123,00) Ohne die Klammern, die sollen nur die Treffer "einrahmen"
Danke fürs helfen, wahrscheinlich ist das obige auch wenns läuft noch zu unsauber geschrieben.
Ich möchte nacher die 4 Werte zeilenweise in eine Textdatei schreiben, da habe ich aus anderen Scripten von euch schon die Tipss bekommen.
Euer XML/TXT-Batch Frak
Ralf
Danke
[Edit Biber] Codeformatierung [/Edit]
ich hab mich an Regulären Ausdrücken und Scripten versucht, komme aber nicht weiter...........
Jeder Beitrag hier hilft mir weiter mich in die Materie einzuarbeiten
Hallo Zusammen,
die Aufgabenstellung wäre folgende : Aus einer XML alle Werte die mit einem REG-Ausdruck übereinstimmen auszugeben.
Ich teste mit dem SystemScripter rum daher der Test zunächst nur über eine Ausgabe und nicht als Export in eine andere Datei.
Er findet die gesuchten Gesamtstrings und zeigt mir die betroffenen Zeilen mit Wscript.Echo auch an.
D.H. die Suche durch die ganze Datei klappt soweit, ich erhalte die richtigen Zeilen.
Jetzt brauche ich aber nur die im regulären Ausdruck mit () gematchten Werte und zwar genau die 4 die ich haben will
Wie ändere ich zunächst den WScript.Echo Befehl um die benötigten Werte auszugeben.
Bisher 123456 VO blablabla 0,00 blablabla 123,00
gebraucht wird (123456) (VO) (0,00) (123,00) Ohne die Klammern, die sollen nur die Treffer "einrahmen"
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
("c:\test\xmltest.xml", ForReading)
Set Suche = New regexp
Suche.pattern ="([0-9]*)\W*([NOAV]{2}\W)[0-9 A-Za-z]*[0-9.]* [0-9.]* [0-9,.]*[ EUR]*([0-9,.-]*)[. \w]*[0-9]* [0-9\W]{1,3} ([0-9,.]*) ([0-9.,-]*)$"
Do Until objTextFile.AtEndOfStream
strNextLine = objTextFile.Readline
arrServiceList = Split(strNextLine , "</Field>")
If Suche.Test(arrServiceList(i)) Then WScript.Echo "Treffer:" & arrServiceList(i)
Loop
Danke fürs helfen, wahrscheinlich ist das obige auch wenns läuft noch zu unsauber geschrieben.
Ich möchte nacher die 4 Werte zeilenweise in eine Textdatei schreiben, da habe ich aus anderen Scripten von euch schon die Tipss bekommen.
Euer XML/TXT-Batch Frak
Ralf
Danke
[Edit Biber] Codeformatierung [/Edit]
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 159902
Url: https://administrator.de/contentid/159902
Ausgedruckt am: 23.11.2024 um 05:11 Uhr
9 Kommentare
Neuester Kommentar
Hallo nulpen!
Nur der Ordnung halber:
In Zeile 18 verwendest Du eine Variable i, der kein Wert zugewiesen wurde - daher ist ihr Wert 0, was bedeutet, dass Du von jeder gelesenen Zeile den Teil vor dem ersten vorkommenden"</Field>" verwendest - wenn Du das ohnehin wolltest, solltest Du anstatt des "i" gleich die Null als Index verwenden ...
Die Zeile 21 (und die zugehörige Zeile 28 sowie die überhaupt sinnlose Zeile 26) sind unnötig - die "
Grüße
bastla
Nur der Ordnung halber:
In Zeile 18 verwendest Du eine Variable i, der kein Wert zugewiesen wurde - daher ist ihr Wert 0, was bedeutet, dass Du von jeder gelesenen Zeile den Teil vor dem ersten vorkommenden"</Field>" verwendest - wenn Du das ohnehin wolltest, solltest Du anstatt des "i" gleich die Null als Index verwenden ...
Die Zeile 21 (und die zugehörige Zeile 28 sowie die überhaupt sinnlose Zeile 26) sind unnötig - die "
For Each
"-Schleife wird ohnehin nur ausgeführt, wenn es zumindest eine Übereinstimmung ("expressionmatch") gibt.Grüße
bastla
Hallo nulpen!
Wenn Du mehrmals die selbe Aktion, nur mit unterschiedlichen Parametern, ausführen willst, bietet sich die Verwendung einer "Function" (wenn es genau ein Ergebnis als Rückgabewert geben sollI) oder eines "Sub" (Unterprogramm, keine unmittelbare Rückgabe von Werten) an - ungetestetes Beispiel:
Grüße
bastla
Wenn Du mehrmals die selbe Aktion, nur mit unterschiedlichen Parametern, ausführen willst, bietet sich die Verwendung einer "Function" (wenn es genau ein Ergebnis als Rückgabewert geben sollI) oder eines "Sub" (Unterprogramm, keine unmittelbare Rückgabe von Werten) an - ungetestetes Beispiel:
Const ForReading = 1
Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objTextFile = objFSO.OpenTextFile _
("c:\test\xmltest.xml", ForReading) 'Anmerkung: "ForReading" ist default, daher könnte dieser Parameter auch weggelassen werden ...
Set RegularExpressionObject = New RegExp
With RegularExpressionObject
.IgnoreCase = False
.Global = True
End With
Do Until objTextFile.AtEndOfStream
strNextLine = objTextFile.Readline
arrServiceList = Split(strNextLine , "</Field>")
Search arrServiceList(0), "([0-9]*)\W*([NOAV]{2}\W)[0-9 A-Za-z]*[0-9.]* [0-9.]* [0-9,.]*[ EUR]*([0-9,.-]*)[. \w]*[0-9]* [0-9\W]{1,3} ([0-9,.]*) ([0-9.,-]*)$"
Search arrServiceList(0), "other pattern"
Search arrServiceList(0), "one more pattern"
'...
Loop
Set RegularExpressionObject = Nothing
'Ende Hauptprogramm
Sub Search(StringToSearch, Pattern)
RegularExpressionObject.Pattern = Pattern
Set expressionmatch = RegularExpressionObject.Execute(StringToSearch)
For Each expressionmatched In expressionmatch
WScript.Echo expressionmatched.SubMatches(0) & ";" & expressionmatched.SubMatches(1) & ";" & expressionmatched.SubMatches(2) & ";" & expressionmatched.SubMatches(3) & ";" & expressionmatched.SubMatches(4)
Next
End Sub
bastla
Hallo nulpen!
Die Frage ist natürlich grundsätzlich einmal: Woran ist zu erkennen, ob ein Teilstring noch zu den Nutzdaten gehört, oder schon "Schrott" ist? Wenn das geklärt wäre, ist der Rest einfach:
Hier würde jeweils an "Leerräumen" (Leerzeichen, Tab, Zeilenende, ...) getrennt - und das ginge in Deinem Beispiel natürlich für "Gasse 17" schon mal schief - daher: ohne gesichertes Suchkriterium kein vernünftiges Suchergebnis ...
Grüße
bastla
Die Frage ist natürlich grundsätzlich einmal: Woran ist zu erkennen, ob ein Teilstring noch zu den Nutzdaten gehört, oder schon "Schrott" ist? Wenn das geklärt wäre, ist der Rest einfach:
Name\s(\S*)\s\S*Strasse\s(\S*)\s\S*PLZ ...
Grüße
bastla
Moin nulpen,
Magst du ein Snickers, falls es etwas länger daueert?
Oder bist du schon in der Lage, einen Zwischenstand zu berichten?
Grüße
Biber
Magst du ein Snickers, falls es etwas länger daueert?
Oder bist du schon in der Lage, einen Zwischenstand zu berichten?
Grüße
Biber
Hallo Biber und bastla,
zu euren Ideen hätte ich auch noch eine bezüglich der sauberen Trennung...
Meine Ausgangsdatei sieht so aus:
-rw-r--r-- 1 testftp users 16485 Feb 8 11:00 editor.xlsx
..
..
In der neuen Datei sollen nur die Dateien (ganz rechts) stehen. Merkmal hier wäre immer der Punkt, sie stehen am Ende und haben eine dreistellige Dateiendung.
Bisherige Ausgabe:
1 testftp users 16485 Feb 8 11:00 editor.xlsx
Mein Code bisher (ebenfalls aus dem Forum), der mir leider noch nicht das finale Ergebnis liefert:
PS: Irgendwie komme ich nicht mit rE.Pattern zurecht ;-(
Wer kann mir helfen?
Ich habs, ich habs, ich habs ... juhu!!!
Gruß OKIDOKI
zu euren Ideen hätte ich auch noch eine bezüglich der sauberen Trennung...
Meine Ausgangsdatei sieht so aus:
-rw-r--r-- 1 testftp users 16485 Feb 8 11:00 editor.xlsx
..
..
In der neuen Datei sollen nur die Dateien (ganz rechts) stehen. Merkmal hier wäre immer der Punkt, sie stehen am Ende und haben eine dreistellige Dateiendung.
Bisherige Ausgabe:
1 testftp users 16485 Feb 8 11:00 editor.xlsx
Mein Code bisher (ebenfalls aus dem Forum), der mir leider noch nicht das finale Ergebnis liefert:
Ein = "test.txt"
Aus = "test_u.txt"
Set fso = CreateObject("Scripting.FileSystemObject")
T = fso.OpenTextFile(Ein).ReadAll
Set rE = New RegExp
rE.Global = True
rE.Pattern = " .*"
Set A = fso.CreateTextFile(Aus)
Set Matches = rE.Execute(T)
For Each Match In Matches
A.WriteLine Match
Next
A.Close
PS: Irgendwie komme ich nicht mit rE.Pattern zurecht ;-(
Wer kann mir helfen?
Ich habs, ich habs, ich habs ... juhu!!!
rE.Pattern = "\b(\w.\w[-.\w]*\.[a-zA-Z]{2,6})\b"
Gruß OKIDOKI