christof
Goto Top

Batch Skript - txt-Files suchen, verifizieren und editieren

Hallo Leute!

Habe ein Problem mit einem Skript! Erst einmal eine grobe Beschreibung:

Ein Quell- und ein Zielordner sollen bis auf das heutige Log-File abgeglichen werden.
Die neuen Files sollen kopiert, und dabei editiert werden.

Details des Programmes /bzw. Ablaufplan:
in einem Verzeichnis alle txt-Files durchsuchen
--> File im Zielordner
--> heißt weitersuchen!
--> File nicht im Ordner & File nicht von Heute
--> heißt das es in den Zielordner kopiert & konvertiert werden muss!
Nach dem Konvertieren sollte die For schleife nach weiteren txt-Files suchen (bis keine neuen mehr zu finden sind)

(Konvertieren heißt in diesem fall, dass ich nach dem 8.ten & 9.ten Komma etwas einfügen will)

@Echo OFF
REM ############################## VARIABLES & START-SETTINGS ############################## 
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\"   
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\"   
SET "Filetyp=log"  
SET "FILL=FILL_"   
set YYYY=%date:~-4%
set MM=%date:~-7,2%
set DD=%date:~-10,2%
set YYYYMMDD=%YYYY%%MM%%DD%

REM ##############################                    MAIN                      ##############################
FOR /F %%i IN ('dir /b %PATH_SOURCE%*.%Filetyp%') DO (  
	SET "File=%%~ni"  
	GOTO :PRUF
)

GOTO :KILL
REM ##############################     Beginn of FUNKTIONS     ############################## 
REM ##############################               Pruf if exists              ############################## 
:PRUF 
(if exist %PATH_DEST%%File%.%Filetyp% ( 'JUMP to next FOR element' ????? ) else (if not %File:~-8,8%==%YYYYMMDD% (GOTO :IMP_CON)))  

REM 'JUMP to next FOR element'  

GOTO :KILL 
REM ##############################      IMPORT & CONVERT      ############################## 
:IMP_CON 
FOR /F "tokens=1,2,3,4,5,6,7,8,9,* delims=," %%A IN (%PATH_SOURCE%%File%.%Filetyp%) DO echo %%A,%%B,%%C,%%D,%%E,%%F,%%G,%FILL%_%%H,%FILL%_%%I,%%J >> %PATH_DEST%%FILE%.%Filetyp%  

'JUMP to next FOR element' ??????  

:KILL 

Problem:
1) Es wird immer nur ein(bzw. das selbe) File kopiert & konvertiert
2) beim Konvertieren gehen Daten verloren, da nicht alle Datenfelder (bzw. Tokens) gefüllt sind.

Könnt Ihr mir helfen?

Danke vorab für Eure Hilfe!!

MFG, Christof

Content-Key: 181371

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

Printed on: April 26, 2024 at 08:04 o'clock

Member: bastla
bastla Mar 02, 2012 at 20:01:47 (UTC)
Goto Top
Hallo Christof und willkommen im Forum!

Gleich vorweg: Mit der passenden (lässt sich auch nachträglich erreichen) liest sich Batch-Code leichter ...
Deine Beschreibung ist etwas ungenau (es werden nicht txt-Files, sondern log-Files gesucht) und unvollständig im Hinblick auf die Namen Inhalte der Dateien - insbesondere, ob und welche Sonderzeichen zu erwarten sind und wie viele Felder es in der Zeile insgesamt gibt; es wäre daher sinnvoll, eine Beispielzeile zu posten ...

... anyhow: Da Dein Vorhaben mit der Variablen %FILE% an der fehlenden "delayedExpansion" scheitert (wobei es aber eigentlich nicht nötig sein sollte, überhaupt eine eigene Variable zu verwenden,) eine etwas geänderte (und ungetestete) Variante auf Basis der derzeit vorliegenden Informationen:
@Echo OFF & setlocal
REM ############################## VARIABLES & START-SETTINGS ##############################
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\"  
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\"  
SET "Filetyp=log"  
SET "FILL=FILL_"  
set YYYY=%date:~-4%
set MM=%date:~-7,2%
set DD=%date:~-10,2%
set YYYYMMDD=%YYYY%%MM%%DD%
set "Dummy=§"  

pushd "%PATH_SOURCE%"  
FOR /F "delims=" %%i IN ('dir /b *.%Filetyp%') DO if not exist "%PATH_DEST%%%i" echo %%i|findstr /b "%YYYYMMDD%">nul || (  
    for /f "usebackq delims=" %%L in ("%%i") do set "Zeile=%%L" & call :ProcessLine "%%i"  
)
popd
goto :eof

:ProcessLine
call set "Zeile=%%Zeile:,,=,%Dummy%,%%"  
call set "Zeile=%%Zeile:,,=,%Dummy%,%%"  
if "%Zeile:~,1%"=="," set "Zeile=%Dummy%%Zeile%"  
for /f "tokens=1-9* delims=," %%A in ("%Zeile%") do set "ZeileNeu=%%A,%%B,%%C,%%D,%%E,%%F,%%G,%FILL%_%%H,%FILL%_%%I,%%J"  
call set "ZeileNeu=%%ZeileNeu:%Dummy%=%%"  
setlocal enabledelayedexpansion
>>"%PATH_DEST%%~1" echo !ZeileNeu!  
endlocal
goto :eof
Das Zeichen "§", das der "Dummy"-Variablen zugewiesen wird, darf im Dateiinhalt nicht vorkommen ...

Grüße
bastla
Member: Christof
Christof Mar 02, 2012 at 20:45:51 (UTC)
Goto Top
Hi Bastla,

erst einmal besten Dank für deine Antwort, & sorry für die Formatierung. Werde es jetzt mal probieren.

Das Problem mit der Schleife ist behoben (Dank Dir ;) )

Kannst du mir den Teil-Code erklären? Wozu dient z.B. ' | '

 
      echo %%i|findstr /b "%YYYYMMDD%">nul || (  

Zu den Datenlücken:
hier mal der original Text aus der .log:

       2012/02/27 00:00:02 +01:00,BPOR:CBOCK:SRCV,1102,10881691,,2012/02/27 00:00:01.480 +01:00,@AB:H8-SUGIT:H8:E-BUS,3:2:1,ABC0105,F4636,,F4636        H8 Rohbus                 von F8-832    PV  =    845 h²\g    PUS  Reca

- Nach dem 8.ten & 9.ten Komma muss ich etwas einfügen (Dieses Merkmal ist das Einzigste was gleich bleibt)
- Alle doppelten Komma werden vom Skript verwurstet.
- Leider ist es nicht immer die gleiche Stelle, an dem die doppelten Kommata vorkommen.


Gruß & Dank!
Member: bastla
bastla Mar 02, 2012 at 20:51:29 (UTC)
Goto Top
Hallo Christof!

Ich habe inzwischen meinen Ansatz oben erweitert, sodass auch das ",,"-Problem behandelt wird - kannst Du ja mal testen ...
echo %%i|findstr /b "%YYYYMMDD%">nul || (
Zur Sicherheit noch eine Alternative unter Verwendung von (temporärem) VBS:
@Echo OFF & setlocal
REM ############################## VARIABLES & START-SETTINGS ##############################
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\"  
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\"  
SET "Filetyp=log"  
SET "FILL=FILL_"  
set YYYY=%date:~-4%
set MM=%date:~-7,2%
set DD=%date:~-10,2%
set YYYYMMDD=%YYYY%%MM%%DD%

set "VBS=%temp%\Convert.vbs"  
 >"%VBS%" echo Set a=WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject"):Lines=Split(fso.OpenTextFile(a(0)).ReadAll,vbCrLf)  
>>"%VBS%" echo For i=0 To UBound(Lines):Fields=Split(Lines(i),","):If UBound(Fields)^>8 Then Fields(8)=a(1)^&Fields(8):Fields(9)=a(1)^&Fields(9):End If:Lines(i)=Join(Fields,","):Next  
>>"%VBS%" echo WScript.Echo Join(Lines,vbCrLf)  

SET "PATH_SOURCE=Z:\TEMP\"  
SET "PATH_DEST=Z:\TEMP\Zielordner\"  

pushd "%PATH_SOURCE%"  
FOR /F "delims=" %%i IN ('dir /b *.%Filetyp%') DO if not exist "%PATH_DEST%%%i" echo %%i|findstr /b "%YYYYMMDD%">nul || (  
    cscript //nologo "%VBS%" "%%i" "%FILL%">"%PATH_DEST%%%i"  
)
popd
del "%VBS%"  
Anmerkung: Da Du inzwischen die Positionen für das Einfügen mit "Nach dem 8.ten & 9.ten Komma" angegeben hast, ist das hier so umgesetzt (siehe Zeile 14) - im Batch oben wurden die Felder 8 & 9 verändert ...

Grüße
bastla
Member: Christof
Christof Mar 02, 2012 at 21:34:30 (UTC)
Goto Top
Ja Super, nun klappt es! RESPEKT!

Nehme nun die VBS-Batch Lösung!
Die ist mal richtig schnell, nicht einmal 1min für 2Logs!

In einem LOG sind ca. 56.000Zeilen!
Das Skript soll bis zu 300Logs in der NAcht konvertieren ;)


Gruß & tausendfachen Dank!
Member: Christof
Christof Mar 07, 2012 at 07:12:12 (UTC)
Goto Top
Hallo,

zufrüh gefreut face-sad

am lebendem System sind mir noch zwei Probleme aufgefallen:

1.) Umlaute werden nicht unterstützt (beim Copy von vbs wird alles verwurstet)
2.) Es ist möglich, dass nach dem 9.Komma kein Eintrag ist.
d.h. wenn zwischen komma 9 & 10 keine Zeichen vorhanden sind, darf hinter dem 9.Komma auch kein %FILL% eingesetzt werden

Kann mit jemand helfen?

Mfg & vielen Dank vorab! Christof
Member: bastla
bastla Mar 07, 2012 at 08:10:01 (UTC)
Goto Top
Hallo Christof!

Versuch es mit folgender (ungetesteten) Variante:
@Echo OFF & setlocal
REM ############################## VARIABLES & START-SETTINGS ##############################
SET "PATH_SOURCE=C:\Users\Christof\Desktop\BATCH\SOURCE\"  
SET "PATH_DEST=C:\Users\Christof\Desktop\BATCH\DEST\"  
SET "Filetyp=log"  
SET "FILL=FILL_"  
set YYYY=%date:~-4%
set MM=%date:~-7,2%
set DD=%date:~-10,2%
set YYYYMMDD=%YYYY%%MM%%DD%
set "Dummy=§"  
for /f "tokens=3 delims=:. " %%i in ('chcp') do set CP=%%i  
chcp 1252 >nul

pushd "%PATH_SOURCE%"  
FOR /F "delims=" %%i IN ('dir /b *.%Filetyp%') DO if not exist "%PATH_DEST%%%i" echo %%i|findstr /b "%YYYYMMDD%">nul || (  
    for /f "usebackq delims=" %%L in ("%%i") do set "Zeile=%%L" & call :ProcessLine "%%i"  
)
popd
chcp %CP% >nul
goto :eof

:ProcessLine
call set "Zeile=%%Zeile:,,=,%Dummy%,%%"  
call set "Zeile=%%Zeile:,,=,%Dummy%,%%"  
if "%Zeile:~,1%"=="," set "Zeile=%Dummy%%Zeile%"  
for /f "tokens=1-9* delims=," %%A in ("%Zeile%") do (  
    if #%%I#=#%Dummy%# (set "ZeileNeu=%%A,%%B,%%C,%%D,%%E,%%F,%%G,%FILL%_%%H,%FILL%_%%I,%%J"  
    ) else (
        "ZeileNeu=%%A,%%B,%%C,%%D,%%E,%%F,%%G,%FILL%_%%H,%%I,%%J"  
    )
call set "ZeileNeu=%%ZeileNeu:%Dummy%=%%"  
setlocal enabledelayedexpansion
>>"%PATH_DEST%%~1" echo !ZeileNeu!  
endlocal
goto :eof
Grüße
bastla
Member: Christof
Christof Mar 07, 2012 at 08:14:34 (UTC)
Goto Top
Hallo & Danke für die schnelle Antwort!


Kann man auch das VBScript umstricken, da dieses wesentlich schneller läuft als das reine Batch-Script?


Gruß, Christof
Member: bastla
bastla Mar 07, 2012 at 09:37:21 (UTC)
Goto Top
Hallo Christof!

Dort sollte es genügen, die Zeile 14 durch
>>"%VBS%" echo For i=0 To UBound(Lines):Fields=Split(Lines(i),","):If UBound(Fields)^>8 Then Fields(8)=a(1)^&Fields(8):If Fields(9)^<^>"" Then Fields(9)=a(1)^&Fields(9):End If:End If:Lines(i)=Join(Fields,","):Next
zu ersetzen ...

Grüße
bastla
Member: Christof
Christof Mar 07, 2012 at 11:42:33 (UTC)
Goto Top
Hey Super!


das Problem mit dem 9.Komma ist dadurch behoben.

Die Umlaute werden trotzdem noch durch den Fleischwolf gedreht. ;)

Kannst du mir da auch helfen?

Gruß, Christof
Member: bastla
bastla Mar 07, 2012 at 13:21:21 (UTC)
Goto Top
Hallo Christof!
Die Umlaute werden trotzdem noch durch den Fleischwolf gedreht. ;)
Schwer nachvollziehbar - in Batch mit der falschen Codepage ist das klar, aber für VBS wäre eigentlich nur die Verwendung von Unicode ein Kriterium ...

Könntest Du mal einen Vorher-Nachher-Vergleich (als Code formatiert) posten?

Grüße
bastla
Member: Christof
Christof Mar 07, 2012 at 13:36:41 (UTC)
Goto Top
Hi,


Vorher:
2011/08/25 13:06:17 +02:00,ORB:TS:DE,1401,3753923,,2011/08/25 13:06:16.870 +02:00,PI6403:%0987BD,3:0:0,PI6403,F60219,,F60219       Drückdrauf               RNASS

Nachher:
2011/08/25 13:06:17 +02:00,ORB:TS:DE,1401,3753923,,2011/08/25 13:06:16.870 +02:00,PI6403:%0987BD,3:0:0,FILL_PI6403,FILL_F60219,,F60219       Drckdrauf               RNASS


Gruß, Christof
Member: bastla
bastla Mar 07, 2012 at 14:05:34 (UTC)
Goto Top
Hallo Christof!

Ich hatte gar nicht daran gedacht, dass ja die neue Datei durch den Batch (per Umleitung) erstellt wird - daher mach aus der Zeile 15
>>"%VBS%" echo fso.CreateTextFile(a(2)).Write Join(Lines,vbCrLf)
und aus der Zeile 22
cscript //nologo "%VBS%" "%%i" "%FILL%" "%PATH_DEST%%%i"
oder verwende die Zeilen 12, 13 und 20 aus meinem letzten Batch-Vorschlag zwischen den Zeilen 20 und 21 bzw zwischen 24 und 25 ...

Grüße
bastla
Member: Christof
Christof Mar 07, 2012 at 14:14:36 (UTC)
Goto Top
TOP!
Läuft wunderbar!

Danke nochmals!

Mfg, Christof