dizzor
Goto Top

Mit Batch Datei auslesen, bestimmte Zeilen sowie Wörter löschen und in Datei sichern

Hallo Community,
ich habe versucht, mein Problem durch Google, DOS-Bücher und andere Möglichkeiten selbst zu lösen, aber ich scheitere trotzdem. Ich glaube, mein Anliegen ist etwas größer, was der Grund sein könnte, dass ich das Script nicht hinbekomme. Ich habe vom Kumpel eine Textdatei bekommen.
In ihr befinden sich verschiedene Nummern, hinter denen sich, durch einen Doppelpunkt getrennt, eine zweite Nummer befindet (quasi ZAHL:ZAHL), und Sätze, die durch "-" abgetrennt sind. Sie sind alle untereinander geschrieben und fortlaufend. Als Bespiel:

..
ZAHL:ZAHL
ZAHL:ZAHL
-
Satz
-
ZAHL:ZAHL
ZAHL:ZAHL
..

Die Batchdatei soll nun folgendes machen:

1. Die Textdatei einlesen
2. Die Zeilen löschen, die mit "-", "S" und "C" beginnen, sodass nur noch die Zahlen mit den Nummern übrig sind und sonst alles gelöscht ist
3. Die Nummern in eine neue Textdatei schreiben
4. Die Zahl hinter dem Doppelpunkt löschen, sodass nur noch die Zahl vor dem Doppelpunkt in der Textdatei steht. Hierbei soll die Batch die gleichen Zahlen, die hinter dem Doppelpunkt stehen in eigene Textdatei schreiben. Beispeil:

ZAHL:1 -> in 1.txt
ZAHL:2 -> in 2.txt

Das war's. Hoffentlich habt ihr ungefähr verstanden, was ich meine. Und das hätte ich wahrscheinlich nie alleine geschafft. Daher freue ich mich, wenn ihr mir hier helfen könntet!

MfG DizzoR

Content-Key: 84740

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

Ausgedruckt am: 28.03.2024 um 15:03 Uhr

Mitglied: bastla
bastla 04.04.2008 um 19:20:05 Uhr
Goto Top
Hallo DizzoR und willkommen im Forum!

Ob ich Dich richtig verstanden habe, wird sich zeigen, wenn Du folgendes direkt an der Kommandozeile eingibst:
for /f "delims=:" %i in ('findstr /b /i /v "\- S C" "D:\Deine Textdatei.txt"') do echo %i>>"%j.txt"  
Bitte beachten: Die neuen Textdateien werden im aktuellen Ordner erstellt (bzw ergänzt, falls sie bereits vorhanden sein sollten). Um sie in einen anderen Ordner zu schreiben, einfach dem "%j.txt" einen Pfad voranstellen, also etwa "D:\Anderer Ordner\%j.txt".

Grüße
bastla

[Edit] Nur als Ergänzung: In einem Batch müsstest Du jeweils die Prozentzeichen verdoppeln und daher %%i bzw %%j schreiben. [/Edit]
Mitglied: DizzoR
DizzoR 04.04.2008 um 20:52:42 Uhr
Goto Top
Es hat super funktioniert, danke!
Mir ist eben nochmal eine Sache eingefallen, die Batch auch schnell automatisch machen sollte, und da du das sogut kannst, wäre es toll, wenn du mir auch schnell bei dem Script behilflich sein könntest. Was ich vorhabe, ist auch ganz einfach.

Ich habe in einer Textdatei mehrere Wörter nebeneinander, und die Batch soll mir alles löschen hinter dem ersten Wort bzw. nur das erste Wort wieder in eine neue Textdatei schreiben.

Wäre super, wenn du mir hier auch behilflich sein könntest!

MfG DizzoR
Mitglied: bastla
bastla 04.04.2008 um 21:10:00 Uhr
Goto Top
Hallo DizzoR!

Freut mich, wenn's geklappt hat. face-smile
Eigentlich solltest Du für ein neues Thema auch einen neuen Thread eröfnnen, aber da ich nun schon mal dabei bin ...

Versuch es so:
for /f "tokens=1,2 delims=: " %i in ('findstr /n ^^^^ "D:\Deine andere Textdatei.txt"') do @echo\%j>>"D:\Deine neue Textdatei.txt"  
Auch diese Zeile kannst Du direkt eingeben oder (mit %%i und %%j) als Batch verwenden.

Grüße
bastla
Mitglied: DizzoR
DizzoR 05.04.2008 um 12:09:14 Uhr
Goto Top
Danke bastler für die Arbeit, nur habe ich nicht drangedacht, dass Sonderzeichen im Wort es quasi unterteilen. Also, es sind Serverlogs in derTextdatei, und die haben das Schema XXX/XXX/XXX und so weiter.
Also wollte ich das jetzt anders machen: Die Batch soll in jeder Zeile nach "index.php" suchen und alles dahinter löschen. So ist's besser face-smile Ich glaube, das ist auch machbar oder?

Danke im Vorraus für die Arbeit! Mfg DizzoR
Mitglied: bastla
bastla 05.04.2008 um 16:33:29 Uhr
Goto Top
Hallo DizzoR!

Für diesen Zweck eignet sich VBScript besser - zB:
'TrimLog.vbs  
Const Crit = "index.php"  
Const Bak = ".bak"  

CritLen = Len(Crit) - 1
Set fso = CreateObject("Scripting.FileSystemObject")  

If WScript.Arguments.Count < 1 Then
	WScript.Echo "Keine Logedatei angegeben!"  
	WScript.Quit 1
End If

LogFile = WScript.Arguments(0)
If Not fso.FileExists(LogFile) Then
	WScript.Echo "Angegebene Logdatei " & LogFile & " nicht gefunden!"  
	WScript.Quit 2
End If

LogBak = LogFile & Bak
If fso.FileExists(LogBak) Then fso.DeleteFile LogBak
fso.MoveFile LogFile, LogBak

Set FileIn = fso.OpenTextFile(LogBak, 1)
Set FileOut = fso.OpenTextFile(LogFile, 2, True)

Do Until FileIn.AtEndOfStream
	LineIn = FileIn.ReadLine
	CritPos = InStr(1, LineIn, Crit, vbTextCompare)
	
	If CritPos Then
		LineOut = Left(LineIn, CritPos + CritLen)
	Else
		LineOut = LineIn
	End If

	FileOut.WriteLine LineOut
Loop

FileOut.Close
FileIn.Close

WScript.Echo "Done."  
Verwendung: Entweder das Log-File per Drag & Drop auf die Scriptdatei oder per Kommandozeilenaufruf übergeben - falls zB das Script als "C:\Scripts\TrimLog.vbs" gespeichert ist:
cscript //nologo "C:\Scripts\TrimLog.vbs" "D:\Log.txt" 
In beiden Fällen wird die Originaldatei mit der zusätzlichen Extension ".bak" im selben Ordner abgelegt.

Grüße
bastla
Mitglied: DizzoR
DizzoR 12.04.2008 um 13:37:28 Uhr
Goto Top
@bastla:

sry, dass ich erst so spät zurück schreibe. Hatte die Woche viel um die Ohren. Also jedenfalls danke für das Script, aber so richtig gegeht hat es nicht. Ich bekam einen Fehler, als ich das Script ausführen wollte, weil WHS ausgeschaltet war. Und als ich es über die Registry einschaltete, hatte ich wieder einen Fehler. Naja, passt schon. Ist jetzt nicht soo wichtig; das erste Script hatte mehr Priorität face-smile

Daher danke für die Hilfe,

MfG DizzoR