brainbug84
Goto Top

Über Batch letzte Zeile in TXT ersetzen bzw löschen

Hi zusammen,

habe leider keine vergleichbaren Themen hier gefunden. Deswegen zu meiner Frage. Ich habe eine Textdatei bereits bearbeitet und möchte nur dass die letzte Zeile gelöscht wird bzw ersetzt. Das Problem hierbei ist, dass die Datei nicht mit einem Carriage Return enden soll, da sonst das Programm dass die Datei einliest Fehler bringt.

Bin sehr dankbar für jede Hilfe.

Gruß Sven

Content-ID: 100029

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

Ausgedruckt am: 16.11.2024 um 03:11 Uhr

bastla
bastla 23.10.2008 um 21:22:55 Uhr
Goto Top
Hallo brainbug84!

Am saubersten bekommst Du das unter Verwendung von (temporärem) VBScript hin, etwa:
@echo off & setlocal
set "Datei=D:\Deine Datei.txt"  
set "Zeile=Neue letzte Zeile"  

set D=%temp%\DelLastLine.vbs
>%D%  echo Set fso=CreateObject("Scripting.FileSystemObject"):F=WScript.Arguments(0):If WScript.Arguments.Count^>1 Then E=WScript.Arguments(1)  
>>%D% echo T=Split(fso.OpenTextFile(F).ReadAll, vbCrLF):Set O=fso.CreateTextFile(F,True):If E="" Then D=2 Else D=1  
>>%D% echo For i = 0 To UBound(T)-D:O.WriteLine T(i):Next:If E="" Then O.Write T(i):Else:o.Write E:End If:O.Close  

cscript //nologo %D% "%Datei%" "%Zeile%"  
Da Du Dich in Deiner Beschreibung anscheinend nicht entscheiden konntest, ob nun die letzte Zeile gelöscht oder ersetzt werden soll, kannst Du dies im Batch über die Zuweisung zur Variablen %Zeile% in Zeile 3 steuern:

Wenn dort, wie im Beispiel, ein Text angegeben wird, so ersetzt dieser die derzeit letzte Zeile in der Datei.

Verwendest Du die Schreibweise
set Zeile=
so wird die letzte Zeile der Datei entfernt.

Grüße
bastla
brainbug84
brainbug84 24.10.2008 um 10:08:02 Uhr
Goto Top
Hi bastla,

Dank dir so funktioniert es auf jeden Fall. Aber nur mit Batch-Befehlen funktioniert das dann nicht oder? Weil ich würde es gern verstehen was du gemacht hast, aber mit VB kenn ich mich leider ned so aus.

Gruß brainbug84
bastla
bastla 24.10.2008, aktualisiert am 18.10.2012 um 18:36:26 Uhr
Goto Top
Hallo brainbug84!

Aber nur mit Batch-Befehlen funktioniert das dann nicht oder?
Unter Verwendung eines Nachbarthread dargestellten "Letzte-Zeilen-Lösch"-Batches) ließe sich das auch per native Batch realisieren:
@echo off & setlocal
set "Datei=D:\Deine Datei.txt"  
set "Zeile=Die ganz neue letzte Zeile"  

set "Bak=bak"  
set "Ret=%temp%\ret"  
set Anzahl=0
for /f "delims=:" %%i in ('findstr /n "^" "%Datei%"') do set Anzahl=%%i  
set /a MitCR=%Anzahl%-2
set /a OhneCR=%Anzahl%-1

if %MitCR% leq 0 (
    echo Die Datei "%Datei%" enthaelt zu wenig Zeilen!  
    goto :eof
)

move "%Datei%" "%Datei%.%Bak%"  
echo\>%Ret%
for /f "tokens=1* delims=:" %%i in ('findstr /n "^" "%Datei%.%Bak%"') do (  
    if %%i leq %MitCR% (>>"%Datei%" echo\%%j)  
    if %%i equ %OhneCR% (
        if defined Zeile (
            set /p=%Zeile%<%Ret%>>"%Datei%"  
        ) else (
            set /p=%%j<%Ret%>>"%Datei%"  
        )
    )
)
Wenn die letzte Zeile nicht ersetzt, sondern gelöscht werden soll, einfach den "Ersatztext" weglassen und die Zeile 3 so schreiben:
<code type"=plain">set Zeile=

Falls Dich die VBS-Variante trotzdem interessieren sollte, hier die ausführliche Form (mit Kommentaren):
'Für Dateizugriff benötigtes Objekt erzeugen  
Set fso=CreateObject("Scripting.FileSystemObject")  

'Ersten Aufrufparameter (=Dateiname) einlesen  
F=WScript.Arguments(0)

'Falls es mehr als einen Parameter gibt: Zweiten Parameter (=Neue Zeile) einlesen  
If WScript.Arguments.Count>1 Then E=WScript.Arguments(1)

'Gesamte Textdatei (lt Parameter 1) in ein Array einlesen  
'Ergebnis: Zeilen befinden sich in T(0) bis T(Zeilenanzahl - 1)  
T=Split(fso.OpenTextFile(F).ReadAll, vbCrLF)

'Ausgabe in Datei vorbereiten (vorhandene Datei dabei überschreiben)  
Set O=fso.CreateTextFile(F,True)

'Abhängig davon, ob ein Ersetzen der letzten Zeile stattfinden soll,  
'die Anzahl der am Ende nicht mit CR auszugebenden Zeilen festlegen  
If E="" Then D=2 Else D=1  

'Alle Zeilen vom Beginn der Datei bis zur letzten mit CR auszugebenden Zeile  
(= vorletzte oder vorvorletzte, abhängig vom Inhalt der Variablen D) durchgehen ...
For i = 0 To UBound(T)-D
    '... und in Datei schreiben (Abschluss mit CR)  
    O.WriteLine T(i)
Next

'Wenn die letzte Zeile nicht ersetzt werden soll ...  
If E="" Then  
    '... vorletzte Zeile ohne CR schreiben,  
    O.Write T(i)

'ansonsten ...  
Else
    '... Ersatzzeile ohne CR schreiben  
    O.Write E
End If

'Datei schließen  
O.Close
Grüße
bastla