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, 1698 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 ..
Ähnliche Inhalte
Batch & Shell
gelöst Suche Batch-Programm zum Zusammenfügen zweier PDF-Dateien (3)

Frage von Sinzal zum Thema Batch & Shell ...

Batch & Shell
Batch mit forfiles - Dateiendung filtern - Dateien löschen (2)

Frage von mschaedler1982 zum Thema Batch & Shell ...

Batch & Shell
gelöst Dateien mit Batch entpacken (9)

Frage von SirNoob zum Thema Batch & Shell ...

Batch & Shell
Cpl Dateien per Batch oder VBS öffnen (1)

Frage von Angelo131095 zum Thema Batch & Shell ...

Neue Wissensbeiträge
Tipps & Tricks

Wie Hackt man sich am besten in ein Computernetzwerk ein

(38)

Erfahrungsbericht von Herbrich19 zum Thema Tipps & Tricks ...

Humor (lol)

Bester Vorschlag eines Supporttechnikers ever: APC

(15)

Erfahrungsbericht von DerWoWusste zum Thema Humor (lol) ...

Heiß diskutierte Inhalte
Festplatten, SSD, Raid
POS Hardware und alternativen zu Raid 1? (21)

Frage von Brotkasten zum Thema Festplatten, SSD, Raid ...

Viren und Trojaner
Verschlüsselungstrojaner simulieren (18)

Frage von AlbertMinrich zum Thema Viren und Trojaner ...

Ubuntu
Nextcloud 12 Antivirus App for Files (8)

Frage von horstvogel zum Thema Ubuntu ...

Server-Hardware
gelöst Empfehlung KVM over IP Switch (8)

Frage von Androxin zum Thema Server-Hardware ...