BATCH Das filtern einer Zahl aus jeder einzelnen Zeile von einer Textdatei
Hallo, und vielen Dank für jede Hilfe die ich bekomme.
Ich habe mich vor einiger Zeit schonmal mit einem BATCH Programm befasst und hatte auch einen Erfolg.
Ich will das Programm aber nun in V2 übergehen lassen und dabei schritte die ich von Hand machen muste nun mit dem Programm machen.
Mein Problem im momment ist:
Ich habe einige dateinamen in einer Textdatei die ca. so aussehen:
aus dieser will ich mit einem befehl diese ausgabe bekommen
Also die Episoden Zahl
Ich bin am überlegen einfach alles was mit _"Buchstabe" anfängt bis zum negsten _ zu löschen und die wörter am Dateianfang bis zum _ löschen und danach alle sonderzeichen zu löschen.
Dan solte die erste Zahl die episodennummer sein.
Das Problem ist wie mach ich so einen Filter ???
Was ich hinbekomme ist:
Alle Sonderzeichen und Buchstaben zu Löschen aber dann würde ja manchmal das 07 am anfang als ausgabe da sein.
Edit: Beispiele Überarbeitet
Ich habe mich vor einiger Zeit schonmal mit einem BATCH Programm befasst und hatte auch einen Erfolg.
Ich will das Programm aber nun in V2 übergehen lassen und dabei schritte die ich von Hand machen muste nun mit dem Programm machen.
Mein Problem im momment ist:
Ich habe einige dateinamen in einer Textdatei die ca. so aussehen:
_BlaBlub__Langweiligertext_-_01_E5F7B270_
_BlaBlub__Langweiligertext_-_02_5D5C3E0F_
_BlaBlub__Langweiligertext_-_Folge_01_36BCEBESz98_
_BlaBlub__Langweiligertext_-_Folge_02_049D9A7E_
_BlaBlub__Langweiligertext!_-_Episode_01_
_BlaBlub__Langweiligertext!_-_Episode_02_
_BlaBlub__Langweiligertext_01_6B9FB6E2_
_BlaBlub__Langweiligertext_02_8F4DF051_
_BlaBlub__Langweiligertext_Folge_01_A4E0CAEE22_
_BlaBlub__Langweiligertext_Folge_02_7142DFF0_
_BlaBlub__Langweiligertext_Episode_01_BFE600CA_
_BlaBlub__Langweiligertext_Episode_02_65D87891G031_
_BlaBlub01__Langweiligertext_-_01_E5F7B270__65DA68_
_BlaBlub02__Langweiligertext_-_02_5D5C3E0F_
_BlaBlub03__Langweiligertext_-_Folge_01_36BCEB98_
_BlaBlub04__Langweiligertext!_-_Folge_02_049D9UZKYA7E_
_BlaBlub05__Langweiligertext!_-_Episode_01_BFE600CA_
_BlaBlub06__Langweiligertext_-_Episode_02_65D87031_
_BlaBlub07__Langweiligertext_01_
_BlaBlub08__Langweiligertext_02_
_BlaBlub09__Langweiligertext_Folge_01_A4E0CE22_
_BlaBlub10__Langweiligertext!_Folge_02_7142DFF0_
_BlaBlub11__Langweiligertext!_Episode_01_BFA681EE600CA_
_BlaBlub12__Langweiligertext_Episode_02_65D87031__65D87031_
aus dieser will ich mit einem befehl diese ausgabe bekommen
01
02
01
02
01
02
...
Also die Episoden Zahl
Ich bin am überlegen einfach alles was mit _"Buchstabe" anfängt bis zum negsten _ zu löschen und die wörter am Dateianfang bis zum _ löschen und danach alle sonderzeichen zu löschen.
Dan solte die erste Zahl die episodennummer sein.
Das Problem ist wie mach ich so einen Filter ???
Was ich hinbekomme ist:
Alle Sonderzeichen und Buchstaben zu Löschen aber dann würde ja manchmal das 07 am anfang als ausgabe da sein.
Edit: Beispiele Überarbeitet
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 187710
Url: https://administrator.de/contentid/187710
Ausgedruckt am: 22.11.2024 um 16:11 Uhr
30 Kommentare
Neuester Kommentar
Hallo Darkprodukt,
Du könntest den Name am String "Episode" trennen, um es einfacher zu machen.
Grüße
rubberman
Du könntest den Name am String "Episode" trennen, um es einfacher zu machen.
@echo off &setlocal
for /f "usebackq delims=" %%a in ("names.txt") do (
set "ln=%%a"
setlocal EnableDelayedExpansion
for /f "tokens=2 delims=•" %%b in ("!ln:Episode=•!") do (
for /f "delims=_" %%c in ("%%b") do echo %%c
)
endlocal
)
pause
Grüße
rubberman
Hallo Zusammen.
Sehr laaangsaaam, sollte aber alle Vorkommen von ein- und zweistelligen numerischen Ausdrücken, die in Underlines eingefasst sind finden.
Ich würde persönlich für RegExp in VBScript plädieren...
[EDIT]@bastla Wir schauen in die gleiche Glaskugel, oder? [/EDIT]
Grüße
rubberman
Sehr laaangsaaam, sollte aber alle Vorkommen von ein- und zweistelligen numerischen Ausdrücken, die in Underlines eingefasst sind finden.
@echo off &setlocal
for /f "usebackq delims=" %%a in ("names.txt") do (
set "ln=%%a"
setlocal EnableDelayedExpansion
for %%b in ("!ln:_=" "!") do echo %%~b|findstr /x "[0-9][0-9]*"
endlocal
)
pause
[EDIT]@bastla Wir schauen in die gleiche Glaskugel, oder? [/EDIT]
Grüße
rubberman
Hallo Darkprodukt!
In diesem Fall würde ich tatsächlich Deine Idee mit der Suche nach der ersten Kombination "_" + Ziffer(n) + "_" aufgreifen (ein wenig VBS im Batch stört ja hoffentlich nicht):
[Edit] noch um Ausgabe der Originalzeile erweitert [/Edit]
Grüße
bastla
[Edit] @rubberman: Deine Ideen sind doch wirklich immer die besten ... [/Edit]
In diesem Fall würde ich tatsächlich Deine Idee mit der Suche nach der ersten Kombination "_" + Ziffer(n) + "_" aufgreifen (ein wenig VBS im Batch stört ja hoffentlich nicht):
@echo off &setlocal
set "Datei=names.txt"
set "F=%temp%\Filtern.vbs"
>"%F%" echo Set rE=New RegExp:rE.Pattern = "_(\d+)_":Lines=Split(CreateObject("Scripting.FileSystemObject").OpenTextFile("%Datei%").ReadAll, vbCrLf)
>>"%F%" echo For Each Line In Lines:Set Matches = rE.Execute(Line):For Each Match In Matches:WScript.Echo Match.SubMatches(0)^&" "^&Line:Next:Next
for /f "tokens=1*" %%a in ('cscript //nologo "%F%"') do echo %%a in %%b
pause
Grüße
bastla
[Edit] @rubberman: Deine Ideen sind doch wirklich immer die besten ... [/Edit]
Hallo Darkprodukt
Ich mache aus
ein
indem ich jeden
Grüße
rubberman
Ich mache aus
_BlaBlub__Langweiligertext_-_01_E5F7B270_
ein
"" "BlaBlub" "" "Langweiligertext" "-" "01" "E5F7B270" ""
indem ich jeden
_
durch " "
ersetze und den gesamten Ausdruck zusätzlich in Anführungszeichen setze. Somit ergeben sich in Anführungszeichen stehende Teilstrings, die durch Leerzeichen voneinander getrennt sind. In der zweiten FOR Schleife wird jeder einzelne Teilstring geprüft.Grüße
rubberman
Hallo Darkprodukt
Warum solltest du nicht können?
Du solltest nur sicherstellen dass tempdatep.txt nicht existiert bzw leer ist.
Füge ggf. vorher ein...
...ein.
Grüße
rubberman
Zitat von @Darkprodukt:
Edit: Ein Problem hätte ich aber noch.
Wie kan ich die Ausgabe in eine datei Umleiten?
Ich kan ja schlecht ...
Edit: Ein Problem hätte ich aber noch.
Wie kan ich die Ausgabe in eine datei Umleiten?
Ich kan ja schlecht ...
Warum solltest du nicht können?
Du solltest nur sicherstellen dass tempdatep.txt nicht existiert bzw leer ist.
Füge ggf. vorher ein...
>%TEMP%\tempdatep.txt type nul
Grüße
rubberman
Hallo Darkprodukt,
Ich hab mal alle ".wandler" Zeilen auskommentiert (habe ich schließlich nicht) und siehe da, in der Datei steht was drin stehen soll.
Dein Problem liegt nicht in der Umleitung der Daten von FINDSTR. Da musst du woanders suchen.
Grüße
rubberman
[EDIT] "tempdatn.txt" liegt auch im %temp% Verzeichnis, oder? Dann schreibe es auch so in die FOR schleife [/EDIT]
Ich hab mal alle ".wandler" Zeilen auskommentiert (habe ich schließlich nicht) und siehe da, in der Datei steht was drin stehen soll.
Dein Problem liegt nicht in der Umleitung der Daten von FINDSTR. Da musst du woanders suchen.
Grüße
rubberman
[EDIT] "tempdatn.txt" liegt auch im %temp% Verzeichnis, oder? Dann schreibe es auch so in die FOR schleife [/EDIT]
moin,
Beim einfachen Alphabet und paar Zeichen hätte ich dazu tendiert:
sonst hätte ich Zwecks Performance so getan:
PS. @Darkprodukt mach bitte noch ein Gelöst Marker an den Thread
[Edit]
b eingetragen
[/Edit]
Gruß Phil
Beim einfachen Alphabet und paar Zeichen hätte ich dazu tendiert:
>"%TEMP%\tempdatf.txt" (for /f "usebackq delims=abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXZ.-_! " %%i in ("C:\Users\Pieh-Ejdsch AD\Desktop\CMD\a.-CRLF.txt") do @echo %%~i)
sonst hätte ich Zwecks Performance so getan:
>"%TEMP%\tempdatf.txt" (for /f "usebackq delims=" %%a in ("tempdatn.txt") do (
set "ln=%%a"
setlocal EnableDelayedExpansion
for %%b in ("!ln:_=" "!") do @if %%~b gtr 0 if %%~b lss 100 echo %%~b
endlocal
))
endlocal
)
PS. @Darkprodukt mach bitte noch ein Gelöst Marker an den Thread
[Edit]
b eingetragen
[/Edit]
Gruß Phil
Hallo Darkprodukt!
Wenn sichergestellt werden soll, dass nur zweistellige Zahlen ausgegeben werden, brauchst Du eigentlich nur den "*" in der Zeile 9 zu entfernen - oder meinen Vorschlag von sehr weit oben auf
zu ändern (da wird dann auch schon im Fall des Falles "OVA" ausgegeben)
Grüße
bastla
Wenn sichergestellt werden soll, dass nur zweistellige Zahlen ausgegeben werden, brauchst Du eigentlich nur den "*" in der Zeile 9 zu entfernen - oder meinen Vorschlag von sehr weit oben auf
@echo off &setlocal
set "Datei=names.txt"
set "F=%temp%\Filtern.vbs"
>"%F%" echo Set rE=New RegExp:rE.Pattern="_(\d\d)_":Lines=Split(CreateObject("Scripting.FileSystemObject").OpenTextFile("%Datei%").ReadAll, vbCrLf)
>>"%F%" echo For Each Line In Lines:Set Matches=rE.Execute(Line):If Matches.Count=0 Then:WScript.Echo "OVA":Else:For Each Match In Matches:WScript.Echo Match.SubMatches(0):Next:End If:Next
cscript //nologo "%F%">%TEMP%\tempdatf.txt
wenn gewünscht mal alle Datein (auch die Tempdatein) in eine Rar packen und sie Hochladen
Es sollte eigentlich schon genügen, die Datei "tempdatn.txt" im Zustand nach der "Wandlung" zu posten ...Grüße
bastla
moin,
Das hat mir jetzt keine Ruhe gelassen:
Findstr lässt sich aber Performanter einsetzen, wenn es nur einmal je Zeile statt pro Wort suchen muss.
OVA wird für ohne Fund ausgegeben.
Gruß Phil
Das hat mir jetzt keine Ruhe gelassen:
Findstr lässt sich aber Performanter einsetzen, wenn es nur einmal je Zeile statt pro Wort suchen muss.
@echo off
set "N=%TEMP%\tempdatn.txt"
set "F=%TEMP%\tempdatf.txt"
.wandler\wandler %TEMP%\tempdatn.txt /Q /L /T /:. /:_ /:Ep /:_ /:@20 /:_
timeout /t 1 >NUL
>"%F%" (for /f "usebackq delims=" %%a in ("%N%") do set "ln=%%a" &call :Read )
.wandler\wandler "%F%" /Q /L /T /:_ /:@20
.wandler\wandler "%F%" /Q /L /T
rem Hier nur exit /b wenn der Batch hier enden soll
::exit /b
goto :HierWeiter
:Read
(for %%b in ("%ln:_=" "%") do @echo(%%~b
)|findstr /rc:"^[0-9][0-9] $" || echo OVA
exit /b
:HierWeiter
rem hier gehts normal weiter
OVA wird für ohne Fund ausgegeben.
Gruß Phil
moin Darkprodukt,
Wenn Du Den Code in einen Batch einfügen willst, musst Du hinter Zeile 18 die Unteroutine mit exit /b 0
beenden.
Der Code soll nach der Zeile 12 beim Batch weitermachen (goto :hierweiter) statt exit /b.
Die Marke :hierWeiter ist dann der Abschluss vom Codeschnipsel.
Oben angepasst zum einfügen
Gruß Phil
Wenn Du Den Code in einen Batch einfügen willst, musst Du hinter Zeile 18 die Unteroutine mit exit /b 0
beenden.
Der Code soll nach der Zeile 12 beim Batch weitermachen (goto :hierweiter) statt exit /b.
Die Marke :hierWeiter ist dann der Abschluss vom Codeschnipsel.
Oben angepasst zum einfügen
Gruß Phil
das mit dem anfügen der SubFunktion ganz ans Ende der Batch - heisst aber auch die ganze Batch wird nach der Sprungmarke :SubFunktion durchsucht. Das nimmt wieder etwas extra viel Zeit in Anspruch.
Wenn Du die SubFuntion Direkt nach der Hauptfuntion (egal welche Programmiesprache) einfügst, dann ist der Weg zur Subfunktion kürzer. Somit auch die Zeit.
Danach (hinter der Sub) kommt der nächste Befehl.
Der Wandler wäre für für Deine Zeile entsprechend in Batch:
und geht auch bei 64Bit Win7.
Gruß Phil
Wenn Du die SubFuntion Direkt nach der Hauptfuntion (egal welche Programmiesprache) einfügst, dann ist der Weg zur Subfunktion kürzer. Somit auch die Zeit.
Danach (hinter der Sub) kommt der nächste Befehl.
Der Wandler wäre für für Deine Zeile entsprechend in Batch:
@echo off
setlocal
>("%TEMP%\withunderlines" (for /f "usebackq delims=" %%i in ("%TEMP%\tempdatn.txt" ) do set "Line=%%i" ^
&setlocal enabledelayedexpansion ^
&set "Line=!Line:.=_!" ^
&set "Line=!Line:Ep=_!" ^
&set "Line=!Line: =_!" ^
&(echo(!Line!) ^
&endlocal
)
move "%temp%\withunderlines" "%TEMP%\tempdatn.txt"
Gruß Phil