115129
Goto Top

Batch - Dezimalzahlen-Addition des Inhalts zweier Dateien mit anschließendem zurückschreiben

Hallo,

ich müsste mich wieder an Euch wenden, da ich nicht weiterkomme um mein Vorhaben umzusetzen.

Das Problem liegt in den letzten zwei Zeilen:
Ich lese mit...
for /f "tokens=1-12* delims=- " %%a in (%IN%) do echo %%l %%i>>"%TEMP%"
...und...
for /f "tokens=1-12* delims=- " %%a in (%OUT%) do echo %%l %%i>>"%TEMP1%"
...den Inhalt zweier Dateien ein und erhalte in die Ausgabedatei "temp.txt"...
Test 1
TestTest 46
dashier 2
TestTestTest 32
...und in die Ausgabedatei "temp1.txt"...
Test 834
TestTest 46
TestTestTest 43942
...ein.
(die Zeile mit dem Wort "dashier" wird rausgefiltert)

Nun möchte ich, dass das Script die Zahlen der "temp.txt" zu den Zahlen in "temp1.txt" addiert.
Das Ergebnis sollte demnach in "archiv.txt" folgendermaßen aussehen:
Test 835
TestTest 46
TestTestTest 43974

Hat die Verrechnung stattgefunden, sollen die Werte...
Test 835
TestTest 46
TestTestTest 43974
nach set "OUT=c:\archiv.txt" zurückgeschrieben und die vorhandenen überschrieben werden.
(Siehe tokens & delims der letzten zwei Zeilen!)

Mein derzeitiger Code:
@echo on & setlocal
set "IN=c:\log"  
set "OUT=c:\archiv.txt"  
set "TEMP=c:\_TEMP.txt"  
set "TEMP1=c:\_TEMP1.txt"  

set "Entf=dashier"  

:Stichwörter suchen; wenn gefunden Zeile löschen
findstr /v /i "%Entf%" "%IN%">"%OUT%"  

:Zahlen-Addition mit folgendem rückschreiben
for /f "tokens=1-12* delims=- " %%a in (%IN%) do echo %%l %%i>>"%TEMP%"  
for /f "tokens=1-12* delims=- " %%a in (%OUT%) do echo %%l %%i>>"%TEMP1%"  
...

Für jede Hilfe bin ich Dankbar face-smile

Gruß,
Blattlaus

Content-Key: 241602

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

Printed on: April 19, 2024 at 07:04 o'clock

Member: Snowman25
Snowman25 Jun 24, 2014 at 08:09:49 (UTC)
Goto Top
Hallo @115129,

wenn du die Strings so aufteilst,dass du die Zahlen in Variablen schreiben kannst, kannst du SET /A verwenden, um die Zahlen zu addieren.
Hoffe das hilft!

Gruß,
@Snowman25
Mitglied: 115129
115129 Jun 24, 2014 at 10:45:17 (UTC)
Goto Top
Hallo Snowman,

danke für deine Antwort.

Genau dies habe ich bereits versucht in Eigenregie hinzubekommen, mir ist jedoch die richtige Formatierung der Zeilen nicht bekannt.

Dachte es wird sich jemand bereit erklären der mir die Zeilen vervollständigt, aber auch konkrete Hinweise bzw. Tips hierzu sind Willkommen.

Das mit
/A
gerechnet wird war mir bekannt, nur wie genau...

Gruß,
Blattlaus
Member: Snowman25
Snowman25 Jun 24, 2014 updated at 13:14:15 (UTC)
Goto Top
Zum "Wie genau" habe ich mal eine Anleitung geschrieben: Rechnen in Batch
Hier mal ein Ansatz Ungetestet:
@ECHO off
SETLOCAL EnableDelayedExpansion


set "IN=c:\log.txt"  
set "OUT=c:\archiv.txt"  
set "TEMP=c:\_TEMP.txt"  
set "TEMP1=c:\_TEMP1.txt"  

set "Entf=dashier"  

:: Stichwörter suchen; wenn gefunden Zeile löschen
findstr /v /i "%Entf%" "%IN%">"%OUT%"  


SET line=0
FOR /F "delims=" %%a IN (%IN%) DO (  
	CALL :set_last %%a
	SET result_a=!last!
	FOR /F "skip=!line! delims=" %%b IN (%OUT%) DO (  
		CALL :set_last %%b
		SET result_b=!last!
		GOTO :CONTINUE
	)
	:CONTINUE
	SET /A result=!result_a! + !result_b!
	:: TODO:
	:: ECHO Anfang des Strings bis zum letzten Token und hänge %result% an.
	
	SET /A line=!line!+1
)

	
GOTO :EOF

:set_last
	FOR %%x IN (%*) DO SET last=%%x
	GOTO :EOF

Gruß,
Andreas
Mitglied: 115129
115129 Jun 24, 2014 at 16:56:00 (UTC)
Goto Top
Hallo Andreas,

vielen Dank für deine Unterstützung.

Natürlich habe ich sofort deinen Quelltext getestet, jedoch habe ich das Gefühl, er kopiert nur die Zahlen von log nach Archiv.txt. Es findet keine Verrechnung bzw. Addition statt.

Inhalt der log:
Datum/Uhrzeit: 2014.05.26 06:27:26 | Name: Mike | Zähler(123): 3 | Nr.: g4246/899464
Datum/Uhrzeit: 2014.05.26 10:42:52 | Name: Olaf | Zähler(123): 6 | Nr.: 656uP47768/6989x0
Datum/Uhrzeit: 2014.05.26 17:37:01 | Name: Karin | Zähler(123): 1 | Nr.: 5432/tQr786

Inhalt der archiv.txt:
Datum/Uhrzeit: 2014.05.24 23:04:30 | Name: Nina | Zähler(123): 53 | Nr.: g4246/899464
Datum/Uhrzeit: 2014.05.24 23:31:09 | Name: Heike | Zähler(123): 12 | Nr.: 53eT6/6s4Qp
Datum/Uhrzeit: 2014.05.24 23:59:35 | Name: Olaf | Zähler(123): 1573 | Nr.: 000/s451d8

Das Script wird ausgeführt -> über log wird erkannt, dass "Nr: g4246/899464" in Archiv.txt enthalten ist -> den Wert von "Zähler(123): 3" aus log also 3 mit "Zähler(123): 53" aus archiv.txt verrechnen/addieren -> den vorhandenen Wert in archiv.txt "Zähler(123): 53" mit dem Ergebnis "56" überschreiben, alle Zeilen die "Nr: g4246/899464" beinhalten -> nicht vorhandene Nummern "Nr.:" sollen von log nach Archiv.txt kopiert werden -> schön wäre noch, dass der jüngste Zeitstempel immer in die erste Zeile geschrieben wird.

Ergebnis:

Inhalt der archiv.txt nach dem Ausführen:
Datum/Uhrzeit: 2014.05.26 17:37:01 | Name: Karin | Zähler(123): 1 | Nr.: 5432/tQr786
Datum/Uhrzeit: 2014.05.26 10:42:52 | Name: Olaf | Zähler(123): 6 | Nr.: 656uP47768/6989x0
Datum/Uhrzeit: 2014.05.24 23:59:35 | Name: Olaf | Zähler(123): 1573 | Nr.: 000/s451d8
Datum/Uhrzeit: 2014.05.24 23:31:09 | Name: Heike | Zähler(123): 12 | Nr.: 53eT6/6s4Qp
Datum/Uhrzeit: 2014.05.24 23:04:30 | Name: Nina | Zähler(123): 56 | Nr.: g4246/899464

Wäre da was zu machen?

Werde definitiv deine Anleitung mal anschauen, ob ich jedoch als Grünschnabel dieses Vorhaben selbständig umsetzen kann stelle ich in Frage.

Gruß,
Blattlaus
Mitglied: 115129
115129 Jun 26, 2014 updated at 08:44:41 (UTC)
Goto Top
Hallo,

ich habe mich nun damit auseinandergesetzt, irgendwie klappts aber nicht.

Mein Code:
@ECHO off
SETLOCAL EnableDelayedExpansion


set "IN=c:\log"  
set "OUT=c:\archiv.txt"  
set "TEMP=c:\_TEMP.txt"  
set "TEMP1=c:\_TEMP1.txt"  
set "TEMP2=c:\_TEMP2.txt"  

set "Entf=dashier"  

:: Stichwörter suchen; wenn gefunden Zeile löschen
findstr /v /i "%Entf%" "%IN%">"%OUT%"  


SET line=0
FOR /F "delims=" %%a IN (%IN%) DO (  
	CALL :set_last %%a
	SET result_a=!last!
	FOR /F "skip=!line! delims=" %%b IN (%OUT%) DO (  
		CALL :set_last %%b
		SET result_b=!last!
		GOTO :CONTINUE
	)
	:CONTINUE
	SET /A result=!result_a! + !result_b!
	:: TODO:
	:: ECHO Anfang des Strings bis zum letzten Token und hänge %result% an.
	ECHO %result% >>"%TEMP2%"  
	
	SET /A line=!line!+1
)

	
GOTO :EOF

:set_last
	FOR %%x IN (%*) DO SET last=%%x
	GOTO :EOF

Ich erhalte als Ausgabe in %TEMP2% :
ECHO ist eingeschaltet (ON).

Was läuft hierbei verkehrt?
Laut Internet sollen Leerzeichen in der Variable dafür verantwortlich sein!?

Weis jemand Rat?

Vielen Dank.

Gruß,
Blattlaus
Member: Snowman25
Snowman25 Jun 26, 2014 at 09:08:17 (UTC)
Goto Top
Hi Blattlaus,

beim schreiben der Batch bin ich davon ausgegangen, dass die letzte Zeichengruppe deiner Zeilen die Nummer enthält.
Leider scheint das in deinem Log nicht so zu sein, weshalb in result_a und result_b keine Zahlen stehen und somit auch nicht verrechnet werden können.

Wie es aussieht ist das 9te Token das, welches du "verrechnet" haben möchtest? Da wird das ganze etwas komplizierter.
Vielleicht wäre es doch besser, das ganze als Excel-Datei zu öffnen und dann per VBA zu verrechnen.

Gruß,
@Snowman25
Mitglied: 115129
115129 Jun 26, 2014 updated at 13:54:12 (UTC)
Goto Top
Hallo Andreas,

beim schreiben der Batch bin ich davon ausgegangen, dass die letzte Zeichengruppe deiner Zeilen die Nummer enthält.
Leider scheint das in deinem Log nicht so zu sein, weshalb in result_a und result_b keine Zahlen stehen und somit auch nicht verrechnet werden können.
Ich habe zum testen in die die log und archiv.txt Dateien jeweils Name, Leerzeichen und eine Nummer geschrieben und gespeichert. In diesem Fall wurde auch folgendes ausgegeben:
ECHO ist eingeschaltet (ON).

Wie es aussieht ist das 9te Token das, welches du "verrechnet" haben möchtest? Da wird das ganze etwas komplizierter.
Vielleicht wäre es doch besser, das ganze als Excel-Datei zu öffnen und dann per VBA zu verrechnen.
Ja, das 9.te Token ist die Zahl die addiert werden soll, sofern die Variabe des 12.ten Token zwichen log und archiv.txt gleich ist.

Batch würde ich bevorzugen, Visual Basic ist natürlich auch ne Option, allerdings hab ich davon absolut keine Ahnung...

Danke und Gruß,
Blattlaus