lyriker
Goto Top

Pro Zeile Logfile erzeugen, und bei nächsten Durchlauf der Vorlage Prüfen, ob es die Zeile schon gibt, aber wie?

Liebe Helfer,
habe hier wieder eine neue Maschine, deren Inhalt ich auch schon in eine gute Form bringe. Leider ist das Logfile ein Mist, weil die Maschine ununterbrochen in das File schreibt, und keine einzelnen Logs auswirft, und das Log einfach zwischendurch wieder die alten Zeilen löscht. Das heißt das ich jeden Tag einen Überhang habe, den ich natürlich nicht doppelt in die Datenbank pflegen will.

Deshalb wollte ich ein Art Log schrieben, der jede Zeile vorab prüft, ob es diese schon importiert hat.

als Identifier habe ich das Datum und die Uhrzeit (10.06.2013 16:34:01.530) erkoren, denn hier ist sicher gestellt, das diese die eindeutige Reihe der Daten erfasst.

Doch irgendwie... geht nüscht.

Beispiel:

Quelle:
F : 10.06.2013 16:34:01.530  Msg.: 1100 FZ: 03:04:20:537 BZ: 05:52:10:419 SZ: 00:29:24:719 STZ:0314 STZ/h:0033.3 --> OK
T : 10.06.2013 16:34:35.779  Msg.: 0003 FZ: 03:04:54:786 BZ: 05:52:10:419 SZ: 00:29:24:719 STZ:0315 STZ/h:0033.4 --> Fertigmeldung --> {;X;39;0039;307910;007;020;002;000000101977;  0.0;1748;H;071305;010;1748.0;002/002;;;;;24;} / GR071305.asc
F : 10.06.2013 16:34:50.190  Msg.: 1203 FZ: 03:05:09:197 BZ: 05:52:10:419 SZ: 00:29:24:719 STZ:0315 STZ/h:0033.3 --> Keine Leisten eingelegt
T : 10.06.2013 16:34:56.198  Msg.: 0003 FZ: 03:05:09:197 BZ: 05:52:16:428 SZ: 00:29:24:719 STZ:0316 STZ/h:0033.4 --> Fertigmeldung --> {;X;80;0080;307910;007;019;002;000000101977;  0.0;485;H;071305;010;485.0;002/002;;;;;24;} / GR071305.asc
F : 10.06.2013 16:38:09.086  Msg.: 1102 FZ: 03:05:09:197 BZ: 05:55:29:315 SZ: 00:29:24:719 STZ:0316 STZ/h:0033.3 --> Notaus aktiv ( Notaus entriegeln + <I-Taster> )
F : 10.06.2013 16:38:19.901  Msg.: 1103 FZ: 03:05:09:197 BZ: 05:55:29:315 SZ: 00:29:35:535 STZ:0316 STZ/h:0033.2 --> Keine Reglerfeigabe ( <Reset> )
F : 10.06.2013 16:38:20.502  Msg.: 1301 FZ: 03:05:09:197 BZ: 05:55:29:315 SZ: 00:29:36:136 STZ:0316 STZ/h:0033.2 --> Bitte Ablauf starten ( <NC-Start> )
F : 10.06.2013 16:38:29.515  Msg.: 1203 FZ: 03:05:09:197 BZ: 05:55:38:328 SZ: 00:29:36:136 STZ:0316 STZ/h:0033.2 --> Keine Leisten eingelegt
F : 10.06.2013 16:38:30.116  Msg.: 1305 FZ: 03:05:09:197 BZ: 05:55:38:928 SZ: 00:29:36:136 STZ:0316 STZ/h:0033.2 --> Leisten einlegen !!!
F : 10.06.2013 16:38:33.120  Msg.: 1304 FZ: 03:05:09:197 BZ: 05:55:41:933 SZ: 00:29:36:136 STZ:0316 STZ/h:0033.2 --> Leiste einlegen und starten ( <NC-Start> )
F : 10.06.2013 16:38:46.940  Msg.: 1100 FZ: 03:05:09:197 BZ: 05:55:55:753 SZ: 00:29:36:136 STZ:0316 STZ/h:0033.2 --> OK
F : 10.06.2013 16:39:10.975  Msg.: 1203 FZ: 03:05:33:231 BZ: 05:55:55:753 SZ: 00:29:36:136 STZ:0316 STZ/h:0033.2 --> Keine Leisten eingelegt
T : 10.06.2013 16:39:17.584  Msg.: 0003 FZ: 03:05:33:231 BZ: 05:56:02:363 SZ: 00:29:36:136 STZ:0317 STZ/h:0033.3 --> Fertigmeldung --> {;X;72;0072;307910;004;028;002;000000101977;  0.0;616;H;071305;010;616.0;002/002;;;;;24;} / GR071305.asc
F : 10.06.2013 16:39:32.606  Msg.: 1102 FZ: 03:05:33:231 BZ: 05:56:17:384 SZ: 00:29:36:136 STZ:0317 STZ/h:0033.3 --> Notaus aktiv ( Notaus entriegeln + <I-Taster> )
F : 10.06.2013 16:39:39.816  Msg.: 1301 FZ: 03:05:33:231 BZ: 05:56:17:384 SZ: 00:29:43:347 STZ:0317 STZ/h:0033.3 --> Bitte Ablauf starten ( <NC-Start> )
F : 10.06.2013 16:39:44.022  Msg.: 1203 FZ: 03:05:33:231 BZ: 05:56:21:590 SZ: 00:29:43:347 STZ:0317 STZ/h:0033.3 --> Keine Leisten eingelegt
F : 10.06.2013 16:39:45.224  Msg.: 1305 FZ: 03:05:33:231 BZ: 05:56:22:791 SZ: 00:29:43:347 STZ:0317 STZ/h:0033.3 --> Leisten einlegen !!!
F : 10.06.2013 16:39:47.627  Msg.: 1304 FZ: 03:05:33:231 BZ: 05:56:25:195 SZ: 00:29:43:347 STZ:0317 STZ/h:0033.3 --> Leiste einlegen und starten ( <NC-Start> )
F : 10.06.2013 16:39:57.842  Msg.: 1100 FZ: 03:05:33:231 BZ: 05:56:35:410 SZ: 00:29:43:347 STZ:0317 STZ/h:0033.3 --> OK



Batch
@echo off & setlocal
set "battemp=Bootctrl.__2"  
set "Sammel=.\export\export.csv"  
set "abgearb=.\abgearbeitet"  

for /f "usebackq tokens=1* delims=:" %%A in ("%battemp%") do (  
    for /f "tokens=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23*" %%C in ("%%B") do (  
        
REM DIESE FOR SCHLEIFE SOLL MIR DAS LOGFILE ERZEUGEN, UND BEI BESTEHENDER LOG DAS SCHREIBEN IN DIE DATEI EXPORT.CSV VERHINDERN:
               for /f "usebackq tokens=1,2,3* delims=:" %%j in ('%%D') do (  
			REM HIER SCHREIBT ER DAS LOG:
			echo|set /p =".">>"%%C_%%j%%k%%l"  
		)
		echo|set /p ="Rotox_ZEA3976001~%%C~%%D~%%E~%%F~%%G~%%H~%%I~%%J~%%K~%%L~">>"%sammel%"  
		for /f "usebackq tokens=1* delims=:" %%V in ('%%M') do (  
			echo|set /p ="%%V~">>"%sammel%"  
			echo|set /p ="%%W~">>"%sammel%"  
		)
		for /f "usebackq tokens=1* delims=:" %%X in ('%%N') do (  
			echo|set /p ="%%X~">>"%sammel%"  
			echo|set /p ="%%Y~">>"%sammel%"  
		)
		echo %%O~%%P %%Q %%R %%S %%T %%U >>"%sammel%"		  
		
		)

)

--- 24.06.2013 hinzugefügt ---
Hier das geschriebene Ergebnis, das dann bei erfolgreichem Export in die Datenbank gelöscht wird:
Rotox_ZEA3976001~10.06.2013~16:34:01.530~Msg.:~1100~FZ:~03:04:20:537~BZ:~05:52:10:419~SZ:~00:29:24:719~STZ~0314~STZ/h~0033.3~-->~OK
--- Ende hinzugefügt ---

Danke schon mal für die Hilfe! Selbst man mir auf die Sprünge hilft, bin ich für jeden Vorschlag dankbar.
Vielleicht macht auch das Nahende Wochenende mein Kopf wuschig ;)

Vorab vieleicht noch:

Quelldatei lässt sich nicht anpassen, und VB kann ich nur bedingt nutzen.

Danke!

Viele Grüß
Lyk

Content-ID: 208439

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

Ausgedruckt am: 25.11.2024 um 07:11 Uhr

Endoro
Endoro 21.06.2013 um 19:13:10 Uhr
Goto Top
Hallo Lyk,

du könntest die Struktur (den "Header") von export.csv mal aufschreiben und ein Beispiel posten.


lg
bastla
bastla 21.06.2013 aktualisiert um 21:52:13 Uhr
Goto Top
Hallo Lyriker!

Prüfen, ob es die Zeile schon gibt, würde ich schematisch etwa so:
findstr /c:"10.06.2013 16:34:01.530" "%Sammel%">nul || echo gibt es noch nicht, daher schreiben
oder
findstr /c:"10.06.2013 16:34:01.530" "%Sammel%">nul && echo gibt es schon, daher überspringen
wobei Datum und Uhrzeit als Suchbegriff natürlich in (einer) Variablen enthalten sein müssten.

Wichtig: Damit das funktionieren kann, muss "%Sammel%" bereits vorweg existieren, was sich zB per
type nul>"%Sammel%"
realisieren ließe ...

Grüße
bastla
Lyriker
Lyriker 24.06.2013 aktualisiert um 09:34:44 Uhr
Goto Top
Hallo und schönen Montag!

in 5 Tagen ist wieder Wochenende! ;)


@Endoro:
--- 24.06.2013 hinzugefügt ---
Hier das geschriebene Ergebnis, das dann bei erfolgreichem Export in die Datenbank gelöscht wird:
Rotox_ZEA3976001~10.06.2013~16:34:01.530~Msg.:~1100~FZ:~03:04:20:537~BZ:~05:52:10:419~SZ:~00:29:24:719~STZ~0314~STZ/h~0033.3~-->~OK
--- Ende hinzugefügt ---

Habe ich auch in den Anfang übernommen

@bastla:

Leider kann man das nicht über die Exportdatei realisieren, weil diese nach erfolgreichem Export in die Datenbank gelöscht werden soll. Aber anstatt für jede Zeile könnte ich natürlich die Export Datei als Log weg schreiben, danke, damit werde ich mal experimentieren!

Aber sehr performant wird das auch nicht sein oder? ;)

Das Script ist schon so ewig langsam... ;) Überlege grad über eine bessere Lösung nach, was schwierig ist, weil ja bestimmte Teile der Token nach bearbeitet werden müssen.

Ich hatte eine Vorablösung schon realisiert (eine Sprungmarke per GOTO aus einer FOR Schleife) nur hat dann das Script nach dem zweiten Durchlauf einfach abgebrochen.

Danke vielmals!

NACHTRAG: gerade festgestellt das die Maschine immer wieder wechselnd über zwei verschiedene Logs schriebt, sobald 10000 Datensätze abgearbeitet sind.

Datei 1 ist Bootctrl.__1
Datei 2 ist Bootctrl.__2

Nur das es dann nicht verwirrend ist, wenn ich diese über einen Call dann aufrufe in das Script.

NACHTRAG ende
Lyriker
Lyriker 24.06.2013 um 10:00:47 Uhr
Goto Top
Ok nochmals getestet, folgendes Script probiert:

~~snipp~~
		findstr /c:"%%C %%D" "D:/Rotox/ZEA3976001/Log/abgearbeitet/export.csv">nul || goto :endeeins  
		echo|set /p ="Rotox_ZEA3976001~%%C~%%D~%%E~%%F~%%G~%%H~%%I~%%J~%%K~%%L~">>"%sammel%"  
		for /f "usebackq tokens=1* delims=:" %%V in ('%%M') do (  
			echo|set /p ="%%V~">>"%sammel%"  
			echo|set /p ="%%W~">>"%sammel%"  
		)
		for /f "usebackq tokens=1* delims=:" %%X in ('%%N') do (  
			echo|set /p ="%%X~">>"%sammel%"  
			echo|set /p ="%%Y~">>"%sammel%"  
		)
		echo %%O~%%P %%Q %%R %%S %%T %%U >>"%sammel%"  
		goto :ende
		:endeeins
		echo uebersprungen!
		pause
		:ende
		echo normales Ende!
		rem pause
		)
~~snipp~~


Leider bricht es dann den kompletten Batch ab... obwohl neue Datensätze in der Vorlage dazu gekommen sind!

*Pistole an den PC hebt*

Ok jetzt geht es mir besser.

Wäre über Ideen dankbar!
bastla
bastla 24.06.2013 um 14:41:33 Uhr
Goto Top
Hallo Lyriker!


Falls nicht, könntest Du ja einmal
		findstr /c:"%%C %%D" "D:/Rotox/ZEA3976001/Log/abgearbeitet/export.csv">nul && (  
			echo uebersprungen!
			pause
		) || (
			echo|set /p ="Rotox_ZEA3976001~%%C~%%D~%%E~%%F~%%G~%%H~%%I~%%J~%%K~%%L~">>"%sammel%"  
			for /f "usebackq tokens=1* delims=:" %%V in ('%%M') do (  
				echo|set /p ="%%V~">>"%sammel%"  
				echo|set /p ="%%W~">>"%sammel%"  
			)
			for /f "usebackq tokens=1* delims=:" %%X in ('%%N') do (  
				echo|set /p ="%%X~">>"%sammel%"  
				echo|set /p ="%%Y~">>"%sammel%"  
			)
			echo %%O~%%P %%Q %%R %%S %%T %%U >>"%sammel%"  
			echo normales Ende!
			rem pause
		)
versuchen ...

Grüße
bastla
Lyriker
Lyriker 24.06.2013 um 15:08:05 Uhr
Goto Top
Hi!

das ist natürlich eine galante(re) Lösung! ;)

Nach Hin und Her probieren habe ich es so realisiert:

Ich schreibe ein Logfile in dem der Stand hinterlegt ist.

Es funktioniert wenngleich es wirklich langsam ist, aber die zeit haben wir, zumal es ja nie immer 10000 Zeilen zu importieren gibt.

Vielen Vielen Dank für die Hilfe nochmals!

@echo off & setlocal enabledelayedexpansion
if exist ".\export\export.csv" (  
del ".\export\export.csv"   
)
rem set "battemp=D:\Rotox\ZEA3976001\Log\Bootctrl.__2"  
set "log_temp=D:\Rotox\ZEA3976001\Log\abgearbeitet\log_temp.csv"  
set "Sammel=D:\Rotox\ZEA3976001\Log\export\export.csv"  
set "log=D:\Rotox\ZEA3976001\Log\abgearbeitet\log.csv"  
for /f "usebackq tokens=1* delims=:" %%A in ("%battemp%") do (  
    for /f "tokens=1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,20,21,22,23*" %%C in ("%%B") do (  
		findstr /c:"%%C~%%D" "%log%">nul || echo|set /p ="Rotox_ZEA3976001~%%C~%%D~%%E~%%F~%%G~%%H~%%I~%%J~%%K~%%L~">>"%sammel%"  
		findstr /c:"%%C~%%D" "%log%">nul || echo|set /p ="Rotox_ZEA3976001~%%C~%%D~%%E~%%F~%%G~%%H~%%I~%%J~%%K~%%L~">>"%log_temp%"  
		for /f "usebackq tokens=1* delims=:" %%a in ('%%M') do (  
			findstr /c:"%%C~%%D" "%log%">nul || echo|set /p ="%%a~">>"%sammel%"  
			findstr /c:"%%C~%%D" "%log%">nul || echo|set /p ="%%b~">>"%sammel%"  
			findstr /c:"%%C~%%D" "%log%">nul || echo|set /p ="%%a~">>"%log_temp%"  
			findstr /c:"%%C~%%D" "%log%">nul || echo|set /p ="%%b~">>"%log_temp%"  
		)
		for /f "usebackq tokens=1* delims=:" %%c in ('%%N') do (  
			findstr /c:"%%C~%%D" "%log%">nul || echo|set /p ="%%c~">>"%sammel%"  
			findstr /c:"%%C~%%D" "%log%">nul || echo|set /p ="%%d~">>"%sammel%"  
			findstr /c:"%%C~%%D" "%log%">nul || echo|set /p ="%%c~">>"%log_temp%"  
			findstr /c:"%%C~%%D" "%log%">nul || echo|set /p ="%%d~">>"%log_temp%"  
		)
		findstr /c:"%%C~%%D" "%log%">nul || echo %%O~%%P %%Q %%R %%S %%T %%U %%V %%W %%X %%Y %%Z>>"%sammel%"	  
		findstr /c:"%%C~%%D" "%log%">nul || echo %%O~%%P %%Q %%R %%S %%T %%U %%V %%W %%X %%Y %%Z>>"%log_temp%"	  
		findstr /c:"%%C~%%D" "%log%">nul || type "%log_temp%">>"%log%"  
		if exist "%log_temp%" (  
			del "%log_temp%"   
		)
		echo %%C~%%D
	)

)