Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

Werte über Reguläre Ausdrücke ausgeben VB Script

Frage Entwicklung Batch & Shell

Mitglied: nulpen

nulpen (Level 1) - Jetzt verbinden

01.02.2011, aktualisiert 18:21 Uhr, 4039 Aufrufe, 9 Kommentare

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"

01.
Const ForReading = 1 
02.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
03.
Set objTextFile = objFSO.OpenTextFile _ 
04.
    ("c:\test\xmltest.xml", ForReading) 
05.
Set Suche = New regexp 
06.
 
07.
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.,-]*)$" 
08.
 
09.
Do Until objTextFile.AtEndOfStream 
10.
    strNextLine = objTextFile.Readline 
11.
    arrServiceList = Split(strNextLine , "</Field>") 
12.
    If  Suche.Test(arrServiceList(i)) Then WScript.Echo "Treffer:" & arrServiceList(i) 
13.
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]
Mitglied: nulpen
01.02.2011 um 18:25 Uhr
Hallo Forum,

könnte sein das ich es habe, es werden die Werte richtig ausgegeben. SUBMATCHES scheinen wohl die Untertreffer zu sein.

Hier mein geänderter Code (unsauber) aber das Ergebnis ist in der Ausgabe welches ich brauche:

01.
Const ForReading = 1 
02.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
03.
Set objTextFile = objFSO.OpenTextFile _ 
04.
    ("c:\test\xmltest.xml", ForReading) 
05.
 
06.
Set RegularExpressionObject = New RegExp 
07.
 
08.
With RegularExpressionObject 
09.
.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.,-]*)$" 
10.
.IgnoreCase = False 
11.
.Global = True 
12.
End With 
13.
 
14.
 
15.
Do Until objTextFile.AtEndOfStream 
16.
	    strNextLine = objTextFile.Readline 
17.
    arrServiceList = Split(strNextLine , "</Field>") 
18.
	StringToSearch = arrServiceList(i) 
19.
	Set expressionmatch = RegularExpressionObject.Execute(StringToSearch) 
20.
	 
21.
	If expressionmatch.Count > 0 Then 
22.
		For Each expressionmatched In expressionmatch 
23.
		WScript.Echo expressionmatched.SubMatches(0) & ";" & expressionmatched.SubMatches(1) & ";" & expressionmatched.SubMatches(2) & ";" & expressionmatched.SubMatches(3) & ";" & expressionmatched.SubMatches(4) 
24.
		Next 
25.
		 
26.
	Else 
27.
 
28.
	End If 
29.
 
30.
Loop 
31.
 
32.
Set RegularExpressionObject = Nothing
Danke fürs drüberkucken, ich versuche jeden -Tag zu lernen.

Ralf
Bitte warten ..
Mitglied: bastla
01.02.2011 um 21:27 Uhr
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 "For Each"-Schleife wird ohnehin nur ausgeführt, wenn es zumindest eine Übereinstimmung ("expressionmatch") gibt.

Grüße
bastla
Bitte warten ..
Mitglied: nulpen
13.02.2011 um 12:32 Uhr
Hallo Bastla,

läuft super, ich habe ergänzend noch eine Frage:

Wenn ich jetzt verschiedene Werte die ich nicht mit einem REG-Ausdruck-String abfragen kann auslesen möchte, also den Block

01.
With RegularExpressionObject 
02.
.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.,-]*)$" 
03.
.IgnoreCase = False 
04.
.Global = True 
05.
End With
mehrfach brauche , wie kriege ich das in die Schleife ?


Beispiel: Im Text sind mehrere Blöcke in der Art von

Name: Meier
Strasse: abc
Wert1: 1213456
Wert2: 22222

usw. vorhanden. Manchmal sind die Felder gefüllt und manchmal nicht. Also geht es in einem REGEX-Befehl nicht.

Da die Feldnamen immer vorhanden sind will ich die Werte oder auch "Leer-Ergebnisse" in einem Rutsch auslesen, das kriege ich irgendwie nicht hin.

Set Suche = New regexp
Set Suche1 = New regexp
Set Suche2 = New regexp
Set Suche3 = New regexp

und dann jeweils den Regulären Ausdruck für jede Suche definieren.

Haut mit der Schleife allerdings nicht hin.

Danke für nen Tip, soll nur in das obige Script mit rein.

Ralf
Bitte warten ..
Mitglied: bastla
13.02.2011 um 21:01 Uhr
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:
01.
Const ForReading = 1 
02.
Set objFSO = CreateObject("Scripting.FileSystemObject") 
03.
Set objTextFile = objFSO.OpenTextFile _ 
04.
    ("c:\test\xmltest.xml", ForReading) 'Anmerkung: "ForReading" ist default, daher könnte dieser Parameter auch weggelassen werden ... 
05.
 
06.
Set RegularExpressionObject = New RegExp 
07.
 
08.
With RegularExpressionObject 
09.
.IgnoreCase = False 
10.
.Global = True 
11.
End With 
12.
 
13.
 
14.
Do Until objTextFile.AtEndOfStream 
15.
    strNextLine = objTextFile.Readline 
16.
    arrServiceList = Split(strNextLine , "</Field>") 
17.
     
18.
    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.,-]*)$" 
19.
    Search arrServiceList(0), "other pattern" 
20.
    Search arrServiceList(0), "one more pattern" 
21.
    '... 
22.
Loop 
23.
 
24.
Set RegularExpressionObject = Nothing 
25.
'Ende Hauptprogramm 
26.
 
27.
Sub Search(StringToSearch, Pattern) 
28.
RegularExpressionObject.Pattern = Pattern 
29.
Set expressionmatch = RegularExpressionObject.Execute(StringToSearch) 
30.
 
31.
For Each expressionmatched In expressionmatch 
32.
    WScript.Echo expressionmatched.SubMatches(0) & ";" & expressionmatched.SubMatches(1) & ";" & expressionmatched.SubMatches(2) & ";" & expressionmatched.SubMatches(3) & ";" & expressionmatched.SubMatches(4) 
33.
Next 
34.
End Sub
Grüße
bastla
Bitte warten ..
Mitglied: nulpen
13.02.2011 um 21:54 Uhr
Hallo bastla,

wie komme ich an die submatches der anderen pattern-werte ran ?

Wenn ich z.B die Werte aus einem Fliesstext

12344p4p Name Ralf kjgjkfjgfjgfjdgjld Strasse Gasse 17 sdlfdldlälfä#slälfäsläsfläsfldaä PLZ 12345 lköäkgkfsdksdfkgs dlkflödkföldskökf
Name Peter kflödskfölkfölfkölkdk Strasse Weg 15 kflsdkdölfködlfköldsksdölkdfölPLZ 88888

auslesen möchte, lokalisiere ich mit regulären Ausdrücken die gewünschten Werte (Name/Strasse/PLZ z.B.)

Da der Text zwischen den Werten aber völlig unterschiedlich ist, kann ich hier mit einem Ausdruck und submatches nichts anfangen.

Es gibt diese Textblöcke allerdings mehrfach im Text so daß ich immer für jeden Block die Werte haben muß. (submatches)

Also mehrere Blöcke mit jeweils deren submatches:

Block 1 : Ralf / Gasse 17 / 12345
Block 2 : Peter / Weg 15 / 88888

Hab schon versucht aus der Suchschleife heraus was zu fnden, er zeigt aber nur den letzten Blockwert an.

Schritte

Suche im Text nach den Werten Name Strasse PLZ und schreibe diese in Datei, dann such weiter und schreibe die nächsten 3 Werte die du findest in die Datei.

Irgendwo hängts beim Verständnis.....

Danke
Ralf
Bitte warten ..
Mitglied: bastla
13.02.2011 um 22:36 Uhr
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:
Name\s(\S*)\s\S*Strasse\s(\S*)\s\S*PLZ ...
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
Bitte warten ..
Mitglied: nulpen
14.02.2011 um 08:26 Uhr
Hallo bastla,

genau das ist ja das Problem, daß ich es mit einem String nicht lösen kann.

Zwischen den benötigten Werten kann alles stehen. So wie es aussieht werden es aber Werte sein, so daß man sich auf einen
Parameter "Feldname1 Leerzeichen Wert1 " festlegen könnte.

Ich kriege nur den Schrott zwischendrin nicht sauber weg.

Wenn ich die einzelnen Werte mit "Feldname1 [0-9,.-]*" "Feldname2 [0-9,.-]*" habe wie kriege ich diese dann in ein Ausgabeformat

Wert1;Wert2
Wert1;Wert2
Wert1;Wert2

da ja alle mehrfach vorkommen, aber immer in der richtigen Reihenfolge.

Ich teste heute abend nochmal ein bischen

Danke

Ralf
Bitte warten ..
Mitglied: Biber
19.02.2011 um 13:13 Uhr
Moin nulpen,


Zitat von nulpen:
Ich teste heute abend nochmal ein bischen
Magst du ein Snickers, falls es etwas länger daueert?
Oder bist du schon in der Lage, einen Zwischenstand zu berichten?

Grüße
Biber
Bitte warten ..
Mitglied: OKIDOKI
09.02.2013, aktualisiert um 16:28 Uhr
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:

01.
Ein = "test.txt" 
02.
Aus = "test_u.txt" 
03.
 
04.
Set fso = CreateObject("Scripting.FileSystemObject") 
05.
T = fso.OpenTextFile(Ein).ReadAll 
06.
 
07.
Set rE = New RegExp 
08.
rE.Global = True 
09.
rE.Pattern = " .*" 
10.
 
11.
Set A = fso.CreateTextFile(Aus) 
12.
Set Matches = rE.Execute(T) 
13.
For Each Match In Matches 
14.
    A.WriteLine Match 
15.
Next 
16.
A.Close
PS: Irgendwie komme ich nicht mit rE.Pattern zurecht ;-(
Wer kann mir helfen?


Ich habs, ich habs, ich habs ... juhu!!!


01.
rE.Pattern = "\b(\w.\w[-.\w]*\.[a-zA-Z]{2,6})\b"
Gruß OKIDOKI
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Ähnliche Inhalte
Outlook & Mail
gelöst Email Anhänge speichern VB Script aber nur bestimmte Dateitypen (Outlook) (4)

Frage von LindeUnimog zum Thema Outlook & Mail ...

VB for Applications
gelöst VB Script rekursiv statt nur ein Ordner (4)

Frage von Saschaaaaa zum Thema VB for Applications ...

VB for Applications
gelöst VB Script nach gefundenem Wort die nächsten 4 Zeichen ersetzten (2)

Frage von deutsch73 zum Thema VB for Applications ...

Batch & Shell
gelöst VBS Script in eine Textdatei ausgeben (VBS mit Batch zusammenführen) (5)

Frage von Luuke257 zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Windows Server
DHCP Server switchen (25)

Frage von M.Marz zum Thema Windows Server ...

SAN, NAS, DAS
gelöst HP-Proliant Microserver Betriebssystem (14)

Frage von Yannosch zum Thema SAN, NAS, DAS ...

Grafikkarten & Monitore
Win 10 Grafikkarte Crash von Software? (13)

Frage von Marabunta zum Thema Grafikkarten & Monitore ...

Windows 7
Verteillösung für IT-Raum benötigt (12)

Frage von TheM-Man zum Thema Windows 7 ...