cqash
Goto Top

Batchverarbeitung suchen und ersetzen ohne Zusatztools

Hallo zusammen,

ich habe folgenden Problem: Ich verarbeite eine CSV-Datei und muss die letzte Zeile in der Datei um einen String erweitern, also quasi suchen und ersetzen. Das Batchskript fügt dann die Ausführungszeit an die Zeile an.

Beispiel:
Letze Zeile in der CSV-Datei (vorher): 2010-04-20;07:15:23;
Letze Zeile in der CSV-Datei (nachher): 2010-04-20;07:15:23;16:53:24;

Ich hoffe jemand kann mir bei dem Thema helfen, ich bin dankbar für jede Idee.

Gruß cqash

Content-ID: 141288

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

Ausgedruckt am: 19.11.2024 um 07:11 Uhr

86263
86263 22.04.2010, aktualisiert am 18.10.2012 um 18:41:49 Uhr
Goto Top
Hast du schon mal hier vorbeigeschaut:
cqash
cqash 22.04.2010 um 20:28:05 Uhr
Goto Top
Ja, habe diverse Einträge von "bastla" durchgelesen und versucht das in meinem Skript umzusetzen, leider bisher ohne Erfolg.
bastla
bastla 22.04.2010 um 20:42:28 Uhr
Goto Top
Hallo cqash!

Wäre natürlich ganz einfach, wenn die letzte Zeile nicht mit einer Zeiilenschaltung endet:
>>D:\Datei.csv 16:53:24;
Problem: Danach gibt's die Zeilenschaltung ... face-sad
Soferne VBScript nicht unter "nogo" fällt:
@echo off & setlocal
set "Datei=D:\Datei.csv"  
set "Zusatz=16:53:24;"  

set A=%temp%\AppendIt.vbs
>%A% echo Set fso=CreateObject("Scripting.FileSystemObject"):D=WScript.Arguments(0):T=fso.OpenTextFile(D).ReadAll:fso.CreateTextFile(D).Write T ^& WScript.Arguments(1)  

cscript //nologo %A% "%Datei%" "%Zusatz%"  
Grüße
bastla
cqash
cqash 22.04.2010 um 20:54:42 Uhr
Goto Top
Hi bastla,

das ist leider auch eins der Probleme, VB, bzw VBS dürfen wir nicht auf dem Server verwenden (Unternehmensrichtlinien), nur BATCH oder perl, wobei ich perl eigentlich vermeiden will. Hast Du vielleicht noch eine weitere Idee. Dir scheint das ja alles so aus den Fingern zu fließen. Schon mal vielen Dank für weitere Ideen/Lösungen.

Gruß cqash
bastla
bastla 22.04.2010 um 20:58:40 Uhr
Goto Top
Hallo cqash!

Na gut - dann vielleicht so:
@echo off & setlocal
set "Datei=D:\Datei.csv"  
set "Zusatz=16:53:24;"  

for /f "usebackq delims=" %%i in ("%Datei%") do set "Letzte=%%i"  
move "%Datei%" "%temp%\Datei.txt"  
findstr /v /b "%Letzte%" "%temp%\Datei.txt">"%Datei%"  
<nul >>"%Datei%" set /p=%Letzte%%Zusatz%  
del "%temp%\Datei.txt"  
Voraussetzung: Die letzte Zeile kommt mit dem selben Inhalt nicht nochmals in der Datei vor ...

[Edit] Zeile 9 zum Aufräumen hinzugefügt [/Edit]
[Edit2] Jetzt so, wie's vorher schon gemeint war ... face-wink [/Edit2]

Grüße
bastla
77559
77559 22.04.2010 um 21:08:53 Uhr
Goto Top
Zitat von @bastla:
Wäre natürlich ganz einfach, wenn die letzte Zeile nicht mit einer Zeiilenschaltung endet:
>>D:\Datei.csv 16:53:24;
> 
Problem: Danach gibt's die Zeilenschaltung ... face-sad

Das ließe sich ja verhindern:
<NUL >>D:\Datei.csvt set /P Dummy=15:53:24;

Gruß
LotPings
bastla
bastla 22.04.2010 um 21:16:23 Uhr
Goto Top
@77559
Bin ja inzwischen auch schon dort face-wink - und auch ohne die Voraussetzung, dass die letzte Zeile keine Zeilenschaltung beinhalten darf ...

Grüße
bastla
cqash
cqash 23.04.2010 um 08:03:12 Uhr
Goto Top
Danke für die vielen Antworten, leider funktioniert es noch nicht ganz richtig. Vielleicht hilft es doch, wenn ich Euch mal den gesamten Code zur Verfügung stelle.

@echo off
SETLOCAL ENABLEEXTENSIONS
SETLOCAL DISABLEDELAYEDEXPANSION
Set log_folder=C:\
Set log_file=test.csv
Set mm=%DATE:~3,2%
Set dd=%DATE:~0,2%
Set yyyy=%DATE:~6,4%
Set stunde=%time:~0,2%
If "%stunde:~0,1%"==" " set stunde=0%stunde:~1,1%  
Set minute=%time:~3,2%
Set sekunde=%time:~6,2%

if %stunde% LSS 12 (goto start) else (goto end)

:start
ECHO %dd%.%mm%.%yyyy%;%stunde%:%minute%:%sekunde%;>> %log_folder%%log_file%
goto finish

:end
for /f "usebackq delims=" %%i in ("%log_folder%%log_file%") do set "Letzte=%%i"   
move "%log_folder%%log_file%" "%temp%\Datei.csv"   
findstr /v /b "%Letzte%" "%temp%\Datei.csv">"%Datei%"   
<nul >>"%log_folder%%log_file%" set /p=%Letzte%%stunde%:%minute%:%sekunde%;  
del "%temp%\Datei.csv"  
goto finish

:finish
exit
bastla
bastla 23.04.2010 um 09:06:53 Uhr
Goto Top
Hallo cqash!
leider funktioniert es noch nicht ganz richtig
ist eine mäßig aussagekräftige Fehlerbeschreibung - da hilft der gepostete Code schon mehr ...

Ersetze die Zeilen 20 bis 26 durch:
:end
for /f "usebackq delims=" %%i in ("%log_folder%%log_file%") do set "Letzte=%%i"   
move "%log_folder%%log_file%" "%temp%\Datei.csv"  >nul  
findstr /v /b "%Letzte%" "%temp%\Datei.csv">"%log_folder%%log_file%"   
>>"%log_folder%%log_file%" echo %Letzte%%stunde%:%minute%:%sekunde%;  
del "%temp%\Datei.csv"  
goto finish
Grüße
bastla

P.S.: Vielleicht solltest Du überhaupt erst am Nachmittag testen ... face-wink