lalaman
Goto Top

In txt nur Wort auslesen und dann mit Textfragmenten ergänzen

Guten Morgen allerseits,

habe mich schon ein bisschen über die Sufu durchgesucht aber irgendwie nix wirklich passendes gefunden; also falls ich nicht richtig geguckt hab seht es mir nach. face-smile
ich denke dass mein Anliegen nicht besonders schwer/aufregend für euch sein wird:

Ich möchte eine txt (nennen wir sie ganz kreativ Liste.txt) auslesen und ein bestimmtes Wort/Textfragment in einer neuen txt gespeichert aufgelistet dannach auffinden (nennen wir sie Ergebnis.txt). Das Wort hat nach seinem immer gleichbleibenden Anfang immer 2 - 5 variierende Zahlen:

Bsp:

Datei=?1273
Datei=?17345
Datei=?523
Datei=?10
...

wobei der erste Teil wie gesagt immer gleichbleibt (Datei=?). Die Worte sind in Fließtext eingearbeitet. Ich habe mit findstr schon rumprobiert aber bekomme immer nur die ganze Zeile aufgelistet jedoch möchte ich nur das Wort/Textfragment haben.

Wenn diese Liste dann erstellt ist soll im zweiten Schritt ein neues Fragment vor jede Zeile in der Ergebnis Liste gesetzt werden. Bsp "Batch" - Dass ich hinterher eine Liste mit den Ausdrücken

BatchDatei=?1273
BatchDatei=?17345
BatchDatei=?523
BatchDatei=?10
...

habe. Ich hoffe das war einigermaßen verständlich; wäre dankbar wenn mir geholfen würde.

Gruß
lalaman

Content-ID: 80356

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

Ausgedruckt am: 24.11.2024 um 23:11 Uhr

bastla
bastla 10.02.2008 um 17:08:25 Uhr
Goto Top
Hallo lalaman und willkommen im Forum!

Aufgrund Deiner Beschreibung bleiben noch Fragen offen:

- Stellt der Suchbegriff immer ein eigenes Wort dar, oder soll er auch als Wortbestandteil (zB in "BatchDatei=?1273") gefunden werden?
- Sollen nur solche Einträge gefunden werden, bei welchen nach dem Suchbegriff "Datei=?" ausschließlich "2 - 5 variierende Zahlen" (eher Ziffern) folgen, bzw stellt auch die Anzahl dieser Ziffern ein Kriterium dar (also: mehr oder weniger Ziffern wären nicht zulässig)?
- Welches Zeichen ist nach der letzten Ziffer zu erwarten: Leerzeichen, Satzzeichen, unbekannt?

Ein erster Ansatz, allerdings nicht in Batch, sondern in VBScript, könnte jedenfalls so aussehen:
Const Liste = "D:\Liste.txt"  
Const Ergeb = "D:\Ergebnis.txt"  
Const Muster = "Datei=\?\d+"  
Const Prefix = "Batch"  

Set fso = CreateObject("Scripting.FileSystemObject")  
Inhalt = fso.OpenTextFile(Liste, 1).ReadAll

Set regAusdr = New RegExp	' Erstellt einen regulären Ausdruck.  
regAusdr.Pattern = Muster	' Setzt das Muster.  
regAusdr.IgnoreCase = True	' Unterscheidet nicht zwischen Groß- und Kleinschreibung  
regAusdr.Global = True		' Sucht alle Vorkommen  

Set Uebereinstimmungen = regAusdr.Execute(Inhalt)	' Führt die Suche aus.  
For Each Uebereinstimmung in Uebereinstimmungen		' Durchläuft die Übereinstimmungen.  
	Ergebnis = Ergebnis & Prefix & Uebereinstimmung.Value & vbCRLF
Next

fso.CreateTextFile(Ergeb, True).Write Ergebnis
Speichere das Script zb unter "C:\Scripts\FindeTextUndErstelleListe.vbs". Falls Du den Windows-Editor verwendest, musst Du entweder vor dem Speichen den Dateityp auf "Alle Dateien" setzen oder den Dateinamen unter Anführungszeichen eingeben, da ansonsten der Typ ".txt" angehängt wird.

Das Script kannst Du per Doppelklick oder aus einem Batch mit
cscript //nologo "C:\Scripts\FindeTextUndErstelleListe.vbs" 
starten.

Gefunden werden alle Vorkommen von "Datei=?#", wobei # für mindestens eine Ziffer steht (Anzahl ansonsten egal) und der Suchbegriff nicht auch als Wortbestandteil gefunden wird.

Grüße
bastla
lalaman
lalaman 10.02.2008 um 17:08:30 Uhr
Goto Top
Ok den ersten Teil hab ich jetzt schon selbst gelöst...Brauch jetzt nur noch einen Tip für eine Batch die bei X-beliebigen Zeilen einer TXT einen bestimmten Ausdruck vor jede Zeile einer bereits vorhandenen Liste setzt...also wie im ersten Post mit der zweiten Liste angegeben.
Wäre sehr dankbar wenn jemand eine Möglichkeit wüsste face-smile

Gruß

Edit...: Huch sorry hatte den Post von bastla gar nicht bemerkt...mal öfter die F5 Taste drücken könnte helfen.
bastla
bastla 10.02.2008 um 17:15:45 Uhr
Goto Top
Hallo lalaman!

Ok den ersten Teil hab ich jetzt schon selbst gelöst
Magst Du Deine Lösung vorstellen?

bei X-beliebigen Zeilen einer TXT einen bestimmten Ausdruck vor jede Zeile einer bereits vorhandenen Liste ...
... bekommst Du etwa so:
@echo off & setlocal
set "Liste=D:\Liste.txt"  
set "Prefix=Batch"  

set "Bak=%Liste%.bak"  

move "%Liste%" "%Bak%"  
for /f "usebackq delims=" %%i in ("%Bak%") do echo %Prefix%%%i>>"%Liste%"  
Die Originaldatei wird als Sicherungskopie unter "Originalname.bak" gespeichert und die neue Version erhält den Namen der Originaldatei.

Grüße
bastla

P.S.:
hatte den Post von bastla gar nicht bemerkt.
Stand ja auch schon ewig lange (seit 17:08:25 Uhr) dort ... face-wink
lalaman
lalaman 10.02.2008 um 17:39:05 Uhr
Goto Top
Also zu den offenen Fragen:

Der Ausdruck stellt kein eigenes Wort dar; er ist in fließenden Text integriert.
Noch ein Bsp.

XYZhgkhlk"Datei=?12335"XYZtvbnvbnvbnext
XYZtexsdfsd"Datei=?87238"XYfghfghfgxttext<>
XYZtasdsxt<>"Datei=?45"Xegfghtexttwewert>
XYZ<xc<yx<>"Datei=?847"YZtsadxssdxt<

Dieser Teil: "Datei=?" ist immer gleich und dahinter befinden sich bis zu 5 Ziffern, die eben variieren. Meinetwegen alle möglichen Zahlen von 1 bis 99999.
Der Ausdruck den ich suche ist immer in "" gesetzt allerdings sind auch noch andere Begriffe in "" gesetzt, also könnte das als alleiniges Suchkriterium nicht genutzt werden.

Ich möchte in meiner Liste (TXT) hinterher haben:

Datei=?12335
Datei=?87238
Datei=?45
Datei=?847

Man müsste also einen Suchlauf nach suche:

"Datei=?....."
"Datei=?...."
"Datei=?..."
"Datei=?.."
"Datei=?."

starten, wobei die Punkte für beliebige Zahlen (oder Ziffern) stehen.
Ich habe inzwischen ein Programm gefunden (TextSTAT) womit ich die Textteile mehr oder weniger komfortabel Filtern kann somit wäre dieser erste Teil, wenn er als Script zu viel Aufwand bedeuten würde, nicht mehr unbedingt wichtig.

Viel mehr fehlt mir noch Teil 2, wofür ich bis jetzt keine Lösung gefunden hab:

aus meiner Liste als TXT in der nichts anderes drinsteht als diese Ausdrücke:

Datei=?12335
Datei=?87238
Datei=?45
Datei=?847

automatisch jeweils an den Anfang jeder Zeile einen weiteren Ausdruck (ohne Leertaste dazwischen) einzuschieben und daraus dann eine solche Liste werden zu lassen:

BatchDatei=?12335
BatchDatei=?87238
BatchDatei=?45
BatchDatei=?847

ps vielen danke für die freundliche Begrüßung hier im Board. Für Batch Probleme schon immer meine absolute lieblingsseite. Aber wie gesagt hierzu hab ich nichts gefunden.

Gruß
lalaman
bastla
bastla 10.02.2008 um 17:45:15 Uhr
Goto Top
Hallo lalaman!

Der Ausdruck stellt kein eigenes Wort dar; er ist in fließenden Text integriert.
Ich passe die VBS-Version oben entsprechend an.

Zu Teil 2 hatte ich auch schon eine Idee ... face-wink

Grüße
bastla
lalaman
lalaman 10.02.2008 um 17:52:50 Uhr
Goto Top
Super...der zweite Teil hat funktioniert! Genau so wie ich mir das gedacht hatte.

Lösung vorstellen ist wohl ein klein wenig übertrieben. Ich gebe zu die Benutzung eines Tools ist diesbezüglich weniger spannend oder kreativ, aber dafür reichen meine Kenntnisse leider nicht aus.
Da es eine relativ große Textmasse ist die ich filtern möchte, auf jeden fall eine Erleichterung...wenn deine vbs-Lösung jetzt natürlich noch funktionieren sollte wär ich hin und weg face-smile

Ich bin im Übrigen immer wieder positiv überrascht über den schnellen Support, den man hier bekommt; auch in anderen Threads ist zumeist 1 Stunde später spätestens eine Lösung da face-smile

P.S.
Wie du schon richtig bemerkt hast bin ich neu (-angemeldet) hier und habe schon des Öfteren von dem "grünen häkchen" bei "erledigt" gelesen...wo aktiviere ich den denn? Vermutlich seh ich den Wald vor lauter Bäumen nicht ;)
bastla
bastla 10.02.2008 um 18:01:43 Uhr
Goto Top
Hallo lalaman!

Sehr lobenswert, dass Du daran gedacht hast: Wie kann ich einen Beitrag als gelöst markieren?

Noch eine Anmerkung zum VBScript: Wenn Du
Const Muster = "Datei=\?\d{1,5}"  
verwendest, werden nur genau 1 bis 5 Ziffern gefunden.

Grüße
bastla
lalaman
lalaman 10.02.2008 um 18:24:10 Uhr
Goto Top
Klappt super mit der vbs, nur noch mal eine Frage wegen den Sonderzeichen in dem Zusammenhang. Ich könnte diesen Suchlauf auch für andere Ausdrücke ganz gut gebrauchen. Wie müsste es z.B. bei

Datei.php?id=1-5 Ziffern


aussehen?


Const Muster = "Datei.php\?\id=d{1,5}"

funktioniert leider nicht.

Vielen Dank schon-/nochmal für die super Hilfe!!!

Gruß
bastla
bastla 10.02.2008 um 18:37:55 Uhr
Goto Top
Hallo lalaman!

Da der Punkt eine besondere Bedeutung hat, musst Du auch diesen "maskieren":
Const Muster = "Datei\.php\?id=\d{1,5}"  
Mit "\d" wird eine Ziffer beschrieben - insoferne war noch eine weitere kleine Korektur erforderlich.

Eine Übersicht über die möglichen Suchmuster findest Du hier.

Grüße
bastla
lalaman
lalaman 10.02.2008 um 18:58:33 Uhr
Goto Top
Jetzt ist es perfekt. Vielen Dank nochmal face-smile