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-Key: 100029

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

Printed on: April 23, 2024 at 12:04 o'clock

Member: bastla
bastla Oct 23, 2008 at 19:22:55 (UTC)
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
Member: brainbug84
brainbug84 Oct 24, 2008 at 08:08:02 (UTC)
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
Member: bastla
bastla Oct 24, 2008, updated at Oct 18, 2012 at 16:36:26 (UTC)
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