Top-Themen

AppleEntwicklungHardwareInternetLinuxMicrosoftMultimediaNetzwerkeOff TopicSicherheitSonstige SystemeVirtualisierungWeiterbildungZusammenarbeit

Aktuelle Themen

Administrator.de FeedbackApache ServerAppleAssemblerAudioAusbildungAuslandBackupBasicBatch & ShellBenchmarksBibliotheken & ToolkitsBlogsCloud-DiensteClusterCMSCPU, RAM, MainboardsCSSC und C++DatenbankenDatenschutzDebianDigitiales FernsehenDNSDrucker und ScannerDSL, VDSLE-BooksE-BusinessE-MailEntwicklungErkennung und -AbwehrExchange ServerFestplatten, SSD, RaidFirewallFlatratesGoogle AndroidGrafikGrafikkarten & MonitoreGroupwareHardwareHosting & HousingHTMLHumor (lol)Hyper-VIconsIDE & EditorenInformationsdiensteInstallationInstant MessagingInternetInternet DomäneniOSISDN & AnaloganschlüsseiTunesJavaJavaScriptKiXtartKVMLAN, WAN, WirelessLinuxLinux DesktopLinux NetzwerkLinux ToolsLinux UserverwaltungLizenzierungMac OS XMicrosoftMicrosoft OfficeMikroTik RouterOSMonitoringMultimediaMultimedia & ZubehörNetzwerkeNetzwerkgrundlagenNetzwerkmanagementNetzwerkprotokolleNotebook & ZubehörNovell NetwareOff TopicOpenOffice, LibreOfficeOutlook & MailPapierkorbPascal und DelphiPeripheriegerätePerlPHPPythonRechtliche FragenRedHat, CentOS, FedoraRouter & RoutingSambaSAN, NAS, DASSchriftartenSchulung & TrainingSEOServerServer-HardwareSicherheitSicherheits-ToolsSicherheitsgrundlagenSolarisSonstige SystemeSoziale NetzwerkeSpeicherkartenStudentenjobs & PraktikumSuche ProjektpartnerSuseSwitche und HubsTipps & TricksTK-Netze & GeräteUbuntuUMTS, EDGE & GPRSUtilitiesVB for ApplicationsVerschlüsselung & ZertifikateVideo & StreamingViren und TrojanerVirtualisierungVisual StudioVmwareVoice over IPWebbrowserWebentwicklungWeiterbildungWindows 7Windows 8Windows 10Windows InstallationWindows MobileWindows NetzwerkWindows ServerWindows SystemdateienWindows ToolsWindows UpdateWindows UserverwaltungWindows VistaWindows XPXenserverXMLZusammenarbeit

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

Frage Entwicklung Batch & Shell

Mitglied: BlattlausOG

BlattlausOG (Level 1) - Jetzt verbinden

23.06.2014, aktualisiert 20:18 Uhr, 1663 Aufrufe, 7 Kommentare

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:
01.
@echo on & setlocal 
02.
set "IN=c:\log" 
03.
set "OUT=c:\archiv.txt" 
04.
set "TEMP=c:\_TEMP.txt" 
05.
set "TEMP1=c:\_TEMP1.txt" 
06.
 
07.
set "Entf=dashier" 
08.
 
09.
:Stichwörter suchen; wenn gefunden Zeile löschen 
10.
findstr /v /i "%Entf%" "%IN%">"%OUT%" 
11.
 
12.
:Zahlen-Addition mit folgendem rückschreiben 
13.
for /f "tokens=1-12* delims=- " %%a in (%IN%) do echo %%l %%i>>"%TEMP%" 
14.
for /f "tokens=1-12* delims=- " %%a in (%OUT%) do echo %%l %%i>>"%TEMP1%" 
15.
...
Für jede Hilfe bin ich Dankbar

Gruß,
Blattlaus
Mitglied: Snowman25
24.06.2014 um 10:09 Uhr
Hallo BlattlausOG,

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
Bitte warten ..
Mitglied: BlattlausOG
24.06.2014 um 12:45 Uhr
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
Bitte warten ..
Mitglied: Snowman25
24.06.2014, aktualisiert um 15:14 Uhr
Zum "Wie genau" habe ich mal eine Anleitung geschrieben: Rechnen in Batch
Hier mal ein Ansatz Ungetestet:
01.
@ECHO off 
02.
SETLOCAL EnableDelayedExpansion 
03.
 
04.
 
05.
set "IN=c:\log.txt" 
06.
set "OUT=c:\archiv.txt" 
07.
set "TEMP=c:\_TEMP.txt" 
08.
set "TEMP1=c:\_TEMP1.txt" 
09.
 
10.
set "Entf=dashier" 
11.
 
12.
:: Stichwörter suchen; wenn gefunden Zeile löschen 
13.
findstr /v /i "%Entf%" "%IN%">"%OUT%" 
14.
 
15.
 
16.
SET line=0 
17.
FOR /F "delims=" %%a IN (%IN%) DO ( 
18.
	CALL :set_last %%a 
19.
	SET result_a=!last! 
20.
	FOR /F "skip=!line! delims=" %%b IN (%OUT%) DO ( 
21.
		CALL :set_last %%b 
22.
		SET result_b=!last! 
23.
		GOTO :CONTINUE 
24.
25.
	:CONTINUE 
26.
	SET /A result=!result_a! + !result_b! 
27.
	:: TODO: 
28.
	:: ECHO Anfang des Strings bis zum letzten Token und hänge %result% an. 
29.
	 
30.
	SET /A line=!line!+1 
31.
32.
 
33.
	 
34.
GOTO :EOF 
35.
 
36.
:set_last 
37.
	FOR %%x IN (%*) DO SET last=%%x 
38.
	GOTO :EOF
Gruß,
Andreas
Bitte warten ..
Mitglied: BlattlausOG
24.06.2014 um 18:56 Uhr
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
Bitte warten ..
Mitglied: BlattlausOG
26.06.2014, aktualisiert um 10:44 Uhr
Hallo,

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

Mein Code:
01.
@ECHO off 
02.
SETLOCAL EnableDelayedExpansion 
03.
 
04.
 
05.
set "IN=c:\log" 
06.
set "OUT=c:\archiv.txt" 
07.
set "TEMP=c:\_TEMP.txt" 
08.
set "TEMP1=c:\_TEMP1.txt" 
09.
set "TEMP2=c:\_TEMP2.txt" 
10.
 
11.
set "Entf=dashier" 
12.
 
13.
:: Stichwörter suchen; wenn gefunden Zeile löschen 
14.
findstr /v /i "%Entf%" "%IN%">"%OUT%" 
15.
 
16.
 
17.
SET line=0 
18.
FOR /F "delims=" %%a IN (%IN%) DO ( 
19.
	CALL :set_last %%a 
20.
	SET result_a=!last! 
21.
	FOR /F "skip=!line! delims=" %%b IN (%OUT%) DO ( 
22.
		CALL :set_last %%b 
23.
		SET result_b=!last! 
24.
		GOTO :CONTINUE 
25.
26.
	:CONTINUE 
27.
	SET /A result=!result_a! + !result_b! 
28.
	:: TODO: 
29.
	:: ECHO Anfang des Strings bis zum letzten Token und hänge %result% an. 
30.
	ECHO %result% >>"%TEMP2%" 
31.
	 
32.
	SET /A line=!line!+1 
33.
34.
 
35.
	 
36.
GOTO :EOF 
37.
 
38.
:set_last 
39.
	FOR %%x IN (%*) DO SET last=%%x 
40.
	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
Bitte warten ..
Mitglied: Snowman25
26.06.2014 um 11:08 Uhr
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
Bitte warten ..
Mitglied: BlattlausOG
26.06.2014, aktualisiert um 15:54 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Humor (lol)

Linkliste für Adventskalender

(3)

Information von nikoatit zum Thema Humor (lol) ...

Heiß diskutierte Inhalte
Router & Routing
gelöst Ipv4 mieten (22)

Frage von homermg zum Thema Router & Routing ...

Windows Server
DHCP Server switchen (20)

Frage von M.Marz zum Thema Windows Server ...

Exchange Server
gelöst Exchange 2010 Berechtigungen wiederherstellen (20)

Frage von semperf1delis zum Thema Exchange Server ...

Hardware
gelöst Negative Erfahrungen LAN-Karten (19)

Frage von MegaGiga zum Thema Hardware ...