landstreicher
Goto Top

Mehrere TXT-Files Zeilenweise auslesen, zusammensetzen und in CSV datei schreiben

Hallo,

Vorweg .. ich habe leider keine passende Lösung im Forum gefunden!

Also ich möchte gern mittels Batch mehrere TXT Files Zeilenweise auslesen welche so aussehen:

11/09/2011 00:00 2
11/09/2011 00:10 1
11/09/2011 00:20 4
11/09/2011 00:30 3
11/09/2011 00:40 2
11/09/2011 00:50 1
11/09/2011 01:00 2
11/09/2011 01:10 9
11/09/2011 01:20 1
11/09/2011 01:30 1
11/09/2011 01:40 0
11/09/2011 01:50 0
11/09/2011 02:00 2
11/09/2011 02:10 2
11/09/2011 02:20 1

11/09/2011 00:00 10
11/09/2011 00:10 15
11/09/2011 00:20 9
11/09/2011 00:30 13
11/09/2011 00:40 5
11/09/2011 00:50 4
11/09/2011 01:00 10
11/09/2011 01:10 9
11/09/2011 01:20 7
11/09/2011 01:30 10
11/09/2011 01:40 13
11/09/2011 01:50 12
11/09/2011 02:00 8
11/09/2011 02:10 6
11/09/2011 02:20 7

So kann ich zwar den Wert den ich brauche auslesen, aber nicht in dem Format schreiben, welches ich benötige face-sad
for /F "tokens=1-10 delims=<> " %%i in (D:\Charts\quelle\Datei1) do echo %%l
for /F "tokens=1-10 delims=<> " %%i in (D:\Charts\quelle\Datei2) do echo %%l
for /F "tokens=1-10 delims=<> " %%i in (D:\Charts\quelle\Datei3) do echo %%l
for /F "tokens=1-10 delims=<> " %%i in (D:\Charts\quelle\datei4) do echo %%l
for /F "tokens=1-10 delims=<> " %%i in (D:\Charts\quelle\datei5) do echo %%l
for /F "tokens=1-10 delims=<> " %%i in (D:\Charts\quelle\datei6) do echo %%l

diese ausgelesenen Werte, die nun aus verschiedenen TXT - Files kommen, will ich pro Uhrzeit in eine Zeile in einer CSV Datei schreiben. bsp:
(an erster Stelle hinter der Uhrzeit steht der Wert der ersten Datei, dann die zweite Datei, ect ...
19.10.2011 00:00;2;10;2;3;0;1;7;1;3;
19.10.2011 00:10;1;15;2;5;1;0;9;2;11;
19.10.2011 00:20;4;9;0;2;1;2;2;11;5;
19.10.2011 00:30;3;13;1;0;0;1;57;8;15;
19.10.2011 00:40;2;5;0;1;2;1;2;1;1;
19.10.2011 00:50;1;4;0;0;1;4;17;2;2;
19.10.2011 01:00;2;10;1;7;1;1;8;1;1;
19.10.2011 01:10;9;9;0;0;0;1;1;2;2;
19.10.2011 01:20;1;7;0;3;1;0;4;1;9;
19.10.2011 01:30;1;10;0;2;0;0;1;5;2;
19.10.2011 01:40;0;13;0;0;1;0;1;1;1;
19.10.2011 01:50;0;12;2;0;2;0;4;6;2;
19.10.2011 02:00;2;8;0;1;0;2;1;2;3;
19.10.2011 02:10;2;6;0;1;0;1;1;1;1;
19.10.2011 02:20;1;7;1;3;1;1;1;7;1;

Irgendwie bekomme ich es nicht hin, das er die Werte dementsprechend ausliest und sie richtig in die CSV - Datei schreibt.
jemand eine Idee ?

gruß Landstreicher

Content-Key: 176011

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

Printed on: April 18, 2024 at 03:04 o'clock

Member: Jochem
Jochem Nov 09, 2011 at 13:59:10 (UTC)
Goto Top
Moin,

nach dem ersten Drübergucken: Kann so nicht funktionieren!

11/09/2011 00:00 2

for /F "tokens=1-10 delims=<> " %%i in (D:\Charts\quelle\Datei1) do echo %%l

- Wo sind da 10 tokens?
- wo sind in der Eingabedatei die Delimiter <> ?
- wieso wird nur %%l ausgegeben?
- wo soll den das Ergebnis von "do echo %%l" hingeschrieben werden?
- wo bleibt beim "echo" der Trenner "," der zu erzeugenden CSV-Datei?
- was soll mit der CSV-Datei weiter passieren (Import nach Excel?)?

Vorschlag:
- lies Dir nochmal den Hilfetext zum "FOR-Befehl" durch und ändere danach Dein Script.
- bau Dir aus den n Ausgangsdateien entsprechende CSV-Dateien
- Importiere diese dann der Reihe nach in eine Excel-Datei mit n Tabellenblättern
- Erstelle dann ein Summenblatt mit den Angaben aus Tabelle-1 bis Tabelle-n
- Zur Not kannst Du dieses Summenbaltt als CSV-Datei exportieren

Alternative:
Du kannst mal austesten, inwieweit sich der FOR-Befehl verschachteln läßt, so daß nach dem Abarbeiten der ersten Datei aus den Folgedateien nur noch der benötigte Wert ausgelesen und weiterverarbeitet wird.

Gruß J face-smile chem
Member: Jochem
Jochem Nov 09, 2011 at 14:00:29 (UTC)
Goto Top
Sorry, Doppelpost .
Member: Landstreicher
Landstreicher Nov 09, 2011 at 14:30:26 (UTC)
Goto Top
Naja, ich bitte ja hier um "Hilfe" und nicht um "helfe dir selbst"

Hätte ich den Nerv und die Zeit sowie das Verständnis, würde ich mir die Hilfe bis in den entlegensten Winkel durchlesen, leider ist dem nicht so.
Ich kann mir gut vorstellen, das es nur ein Einzeiler ist der hier zur Lösung meines Problems führen könnte.

also, kannst du mir dabei helfen ? ;)
Member: Jochem
Jochem Nov 09, 2011 at 15:04:35 (UTC)
Goto Top
Moin,

Hätte ich den Nerv und die Zeit sowie das Verständnis....

Tja, am Verständnis kann man was tun: Lesen bildet, hatte ich ja schon vorgeschlagen.

Zu den anderen beiden Punkten: Du hast weder Nerv noch Zeit, aber ich soll Zeit und Nerven einbringen, um Dir eine mundgerechte Lösung (evtl. Einzeiler) zu liefern, die Du nur noch "schlucken" mußt? Nicht wirklich, oder?

Für mich daher hier EOD.

Gruß J face-smile chem
Mitglied: 60730
60730 Nov 09, 2011, updated at Oct 18, 2012 at 16:49:04 (UTC)
Goto Top
Moinsen,

Zitat von @Landstreicher:
Naja, ich bitte ja hier um "Hilfe" und nicht um "helfe dir selbst"

naja - aber ganz ehrlich sowas findet man aber wirklich relativ schnell und vielleicht fällt dir auf den ersten Blick was auf.
Mal ganz unten, die letzte Zeile studieren

Gruß
Member: pieh-ejdsch
pieh-ejdsch Nov 10, 2011 at 16:11:41 (UTC)
Goto Top
moin,

als CMD-OneLiner geht es vllt so
>nul 3>"D:\Neue.CSV" (for /f usebackqtokens^=1-3 %i in ("D:\Datei A.txt") do (set "line=" & for %a in ("D:\Datei B.txt" "C:\Datei C.txt") do for /f tokens^=3 %m in (' findstr /b /c:"%i %j" %a ') do if defined Line (call set "Line=%Line%;%m") else set "line=;%m" )&& >&3 call echo %i %j;%k%Line%)&set "line="  

Gruß Phil
Member: Landstreicher
Landstreicher Nov 11, 2011 at 10:41:19 (UTC)
Goto Top
danke erstmal Phil, aber sorry, ich komm damit echt nicht klar face-sad


also ich hab das jetzt noch mal etwas geändert ...

for /F "tokens=1-4" %%a in (D:\Charts\quelle\CPU_Q4DE8NCOJ23_20111109) do echo DKS >>D:\test.csv
for /F "tokens=1-4" %%a in (D:\Charts\quelle\CPU_Q4DE8NCOJ23_20111109) do echo ;%%b %%c>>D:\test.csv
for /F "tokens=1-4" %%a in (D:\Charts\quelle\CPU_Q4DE8NCOJ23_20111109) do echo ;;%%d>>D:\test.csv
for /F "tokens=1-4" %%a in (D:\Charts\quelle\CPU_Q4DE8NCOJ24_20111109) do echo ;;;%%d;>>D:\test.csv

soweit schreibt er zwar alles in eine Datei, nur eben untereinander anstatt das ausgelesen von der 2ten Datei dahinter zu schreiben ...

eigentlich brauche ich ja nur ne Lösung, wie ich alle folgedaten dahinter statt drunter bekomme

PS: ja ich bin kein Profi , nennt mich noob face-wink

mfg
Member: Landstreicher
Landstreicher Nov 11, 2011, updated at Oct 18, 2012 at 16:49:05 (UTC)
Goto Top
Zitat von @60730:
Moinsen,

> Zitat von @Landstreicher:
> ----
> Naja, ich bitte ja hier um "Hilfe" und nicht um "helfe dir selbst"

naja - aber ganz ehrlich sowas findet man aber wirklich relativ
schnell und vielleicht fällt dir auf den ersten Blick was auf.
Mal ganz unten, die letzte Zeile studieren

Gruß

wenn du dich auf "Problem gelöst" und keine Lösung geschrieben beziehen solltest? ....
sprich es ruhig aus .. ich hatte so meine Gründe.
Member: Landstreicher
Landstreicher Nov 11, 2011 at 11:25:29 (UTC)
Goto Top
Zitat von @Jochem:
Moin,

> Hätte ich den Nerv und die Zeit sowie das Verständnis....

Tja, am Verständnis kann man was tun: Lesen bildet, hatte ich ja schon vorgeschlagen.

Zu den anderen beiden Punkten: Du hast weder Nerv noch Zeit, aber ich soll Zeit und Nerven einbringen, um Dir eine mundgerechte
Lösung (evtl. Einzeiler) zu liefern, die Du nur noch "schlucken" mußt? Nicht wirklich, oder?

Für mich daher hier EOD.

Gruß J face-smile chem

zu deinen beiden Punkten
a) kurz, ich verstehe es nicht .
b) doch, ich dachte das ist ein Forum in dem man hilfe bekommt und nicht die "hilfe" zur hilfe face-wink

was deine Vorschläge angeht, so habe ich alle durch und sie haben mir leider in diesem Fall nichts gebracht.
In excel dateien einlesen ect. kein ding, da sich aber der Dateinamen (datum) täglich ändert und ich die Quelldateien so belassen muss und ich auch hier nicht weiss wie ich das dort am besten einbaue, komme ich auch mit excel nicht weiter.

mfg Landstreicher
Member: pieh-ejdsch
pieh-ejdsch Nov 11, 2011 at 13:16:46 (UTC)
Goto Top
moin Landstreicher,

in dem Einzeiler sind Dateinamen: "D:\Neue.CSV"; "D:\Datei A.txt"; "D:\Datei B.txt"; "C:\Datei C.txt"

Die csv steht für die Ausgabedatei.
Die txt der 1.ForSchleife gibt die Zeilenanfänge vor (11/09/2011 00:00).
In der 2. ForSchleife stehen die restlichen txt-Files, welche der dritten Forschleife zum herausfummeln der Werte übergeben werden. Die Variable Line wird mit dem call mit ihrem eigenen Wert und dem jeweilig hinzuzufügenden Herausgefummelten Wert ergänzt. Wenn alle Dateien der zweiten FOR durch sind wird die Variable Line mit dem call echo ausgegeben und wird ins dritte Handle geschrieben, welches in die CSV geschrieben wird. Dann gehts mit der nächsten Zeile der TXT der 1.FOR weiter. usw..

um dies in eine Batch zu Übertragen/aufzudröseln musst Du alle Prozentzeichen (dieses Onliners) Verdoppeln.

Gruß Phil
Member: pieh-ejdsch
pieh-ejdsch Nov 11, 2011 at 21:35:25 (UTC)
Goto Top
Ohne die Call, Sub oder delayedexpansion sähe das ganze in etwa so aus.

@echo off &setlocal

set inDatei1="D:\Datei1.txt"  
set inDateiNext="D:\Datei2.txt" "D:\Datei3.txt" "D:\Datei4.txt"  
set Output=3^>"D:\Output.csv"  

%Output% >nul <nul (
	for /f usebackqtokens^=1-3 %i in (%inDatei1%) do (
		 >&3 set/p="%i %j;%k"  
		for %a in (%inDateiNext%) do for /f tokens^=3 %m in (' findstr /b /c:"%i %j" %a ') do >&3 set/p=";%m"  
		 >&3 echo(
)	)

Gruß Phil
Member: Landstreicher
Landstreicher Nov 14, 2011 at 11:29:10 (UTC)
Goto Top
Hi,

danke erstmal .. habs auch gleich mal getestet. Leider meckert er hier das erste "do" an:
do for /f tokens^=3 %m in (' findstr /b /c:"%i %j" %a ') do >&3 set/p=";%m"

..."do" ist syntaktisch an dieser Stelle nicht verarbeitbar.

ne idee was falsch ist ?
Member: bastla
bastla Nov 16, 2011 at 19:23:17 (UTC)
Goto Top
Hallo Landstreicher!

Da das ja ein Batch sein soll, müssen alle Laufvariablen (also zB "%i") mit zwei Prozentzeichen geschrieben werden ...
Eine etwas flexiblere Variante sähe übrigens etwa so aus:
@echo off &setlocal
set "Ordner=D:\"  
set "inDatei=Datei*.txt" & set "inDatei1="  
set Output=3^>"Output.csv"  

pushd "%Ordner%"  
del "%Output%" 2>nul  
for /f "delims=" %%i in ('dir /b /on "%inDatei%"') do if not defined inDatei1 set "inDatei1=%%i"  
if not defined inDatei1 echo Keine passende Datei gefunden! & goto :eof

%Output% >nul <nul (
	for /f usebackqtokens^=1-3 %%i in (%inDatei1%) do (
		 >&3 set/p="%%i %%j;%%k"  
		for /f "skip=1 delims=" %%a in ('dir /b /on "%inDatei%"') do for /f tokens^=3 %%m in (' findstr /b /c:"%%i %%j" %%a ') do >&3 set/p=";%%m"  
		 >&3 echo(
)	)
popd
Hier genügt es, den Ordner und die Dateimaske anzugeben ...

Grüße
bastla
Member: Landstreicher
Landstreicher Nov 17, 2011 at 12:44:25 (UTC)
Goto Top
Hallo Bastla,

danke erstmal.

folgene Probleme hab ich noch.

1) er liesst mir leider nur eine Datei aus (die erste) und nicht alle Dateien die in dem Ordner liegen. bzw. schreibt diese in die Output-Datei.
so findet er bsp: (echo on)

D:\Charts\quelle>for /F "delims=" %i in ('dir /b /on "CPU_Q4DE8NCO*"') do if not defined inDatei1 set "inDatei1=%i"

D:\Charts\quelle>if not defined inDatei1 set "inDatei1=CPU_Q4DE8NCOJ23_20111109"

D:\Charts\quelle>if not defined inDatei1 set "inDatei1=CPU_Q4DE8NCOJ24_20111109"

D:\Charts\quelle>if not defined inDatei1 set "inDatei1=CPU_Q4DE8NCOJ25_20111109"

D:\Charts\quelle>if not defined inDatei1 set "inDatei1=CPU_Q4DE8NCOJ26_20111109"

D:\Charts\quelle>if not defined inDatei1 set "inDatei1=CPU_Q4DE8NCOJ27_20111109"

D:\Charts\quelle>if not defined inDatei1 set "inDatei1=CPU_Q4DE8NCOJ28_20111109"

D:\Charts\quelle>if not defined inDatei1 set "inDatei1=CPU_Q4DE8NCOU29_20111109"

D:\Charts\quelle>if not defined inDatei1 set "inDatei1=CPU_Q4DE8NCOU30_20111109"

D:\Charts\quelle>if not defined inDatei1 set "inDatei1=CPU_Q4DE8NCOU31_20111109"

D:\Charts\quelle>if not defined inDatei1 echo Keine passende Datei gefunden! & goto :eof

D:\Charts\quelle>(for /F usebackqtokens=1-4 %i in (CPU_Q4DE8NCOJ23_20111109) do (
set/p=";%j %k;%l" 1>&3
for /F "skip=1 delims=" %a in ('dir /b /on "CPU_Q4DE8NCO*"') do for /F tokens=3 %m in (' findstr /b /c:"%i %j" %a ') do set/p="
echo( 1>&3
) ) 3>aktuell_win.csv 1>nul 0<nul


2) in die erste Zeile der CSV-Datei muss rein
SID;Datum/Zeit;Q4DE8NCOJ23;Q4DE8NCOJ24;Q4DE8NCOJ25;Q4DE8NCOJ26;Q4DE8NCOJ27;Q4DE8NCOJ28;Q4DE8NCOU29;Q4DE8NCOU30;Q4DE8NCOU31;
.. und in der ersten Spalte dann unter SID, "ABC"


das "ENDPRODUKT" sollte dann so aussehen:

SID;Datum/Zeit;Q4DE8NCOJ23;Q4DE8NCOJ24;Q4DE8NCOJ25;Q4DE8NCOJ26;Q4DE8NCOJ27;Q4DE8NCOJ28;Q4DE8NCOU29;Q4DE8NCOU30;Q4DE8NCOU31
ABC;19.10.2011 00:00;6;10;2;3;0;1;7;1;3
ABC;19.10.2011 00:10;3;15;2;5;1;0;9;2;11
ABC;19.10.2011 00:20;1;9;0;2;1;2;2;11;5
ABC;19.10.2011 00:30;1;13;1;0;0;1;57;8;15
ABC;19.10.2011 00:40;0;5;0;1;2;1;2;1;1
ABC;19.10.2011 00:50;2;4;0;0;1;4;17;2;2
ABC;19.10.2011 01:00;2;10;1;7;1;1;8;1;1
ABC;19.10.2011 01:10;3;9;0;0;0;1;1;2;2
ABC;19.10.2011 01:20;0;7;0;3;1;0;4;1;9
ABC;19.10.2011 01:30;2;10;0;2;0;0;1;5;2
ABC;19.10.2011 01:40;0;13;0;0;1;0;1;1;1
ABC;19.10.2011 01:50;1;12;2;0;2;0;4;6;2
ABC;19.10.2011 02:00;2;8;0;1;0;2;1;2;3
ABC;19.10.2011 02:10;1;6;0;1;0;1;1;1;1
ABC;19.10.2011 02:20;0;7;1;3;1;1;1;7;1
ABC;19.10.2011 02:30;4;15;1;0;0;6;1;1;3
ABC;19.10.2011 02:40;5;9;0;2;0;0;3;11;2
ABC;19.10.2011 02:50;4;12;1;1;3;0;1;2;1
ABC;19.10.2011 03:00;3;7;0;0;0;1;18;3;33
ABC;19.10.2011 03:10;3;6;1;1;1;0;19;3;5
ABC;19.10.2011 03:20;3;10;0;1;0;0;3;2;1
ABC;19.10.2011 03:30;2;13;1;3;0;0;5;1;1
ABC;19.10.2011 03:40;0;4;0;1;0;0;11;1;1
ABC;19.10.2011 03:50;3;8;0;0;2;5;4;1;1
ABC;19.10.2011 04:00;2;4;0;1;0;2;1;7;1
ABC;19.10.2011 04:10;5;5;1;1;0;2;2;1;3
Mitglied: 60730
60730 Nov 17, 2011 at 13:50:07 (UTC)
Goto Top
moin,

er liesst mir leider nur eine Datei aus (die erste) und nicht alle Dateien die in dem Ordner liegen
 for /F "delims=" %i in ('dir /b /on "CPU_Q4DE8NCO*"') do if not defined inDatei1 set "inDatei1=%i"

Was will uns diese Zeilenkombination sagen? do if not defined?
Das Hilfe zur selbsthilfe auch etwas eigeninitiative voraussetzt?

Denk mal drüber nach, ist ganz einfach - du hast 2 Alternativen, wie du aus der Nummer herauskommst.

Gruß
Member: bastla
bastla Nov 17, 2011 at 13:59:10 (UTC)
Goto Top
Hallo Landstreicher!

Da bei Deinem Test sowohl der Batch, als auch die Struktur der Datendateien (ist "ABC" im Ergebnis eigentlich eine Konstante?) verändert waren, solltest Du für beide den derzeitigen Stand posten ...

Übrigens sollte es Dich nicht wundern, dass
 for /F "skip=1 delims=" %a in ('dir /b /on "CPU_Q4DE8NCO*"') do for /F tokens=3 %m in (' findstr /b /c:"%i %j" %a ') do set/p="
keine Ausgabe der Werte aus den übrigen Dateien erzeugt ...

Grüße
bastla
Member: Landstreicher
Landstreicher Nov 18, 2011 at 08:56:44 (UTC)
Goto Top
Moin Bastla,

sorry hab wohl etwas verwirrung gestiftet ...

also ich fasse mal die Änderungen zusammen.

die Quelldateien liegen im Ordner
D:\Charts\quelle
und heissen CPU_Q4DE8NCOj23_(jeweiliges DaTUM) ohne .txt bsp:CPU_Q4DE8NCOJ23_20111118
CPU_Q4DE8NCOj24_(jeweiliges DaTUM)
CPU_Q4DE8NCOj25_(jeweiliges DaTUM)
CPU_Q4DE8NCOj26_(jeweiliges DaTUM)
CPU_Q4DE8NCOj27_(jeweiliges DaTUM)
CPU_Q4DE8NCOj28_(jeweiliges DaTUM)
CPU_Q4DE8NCOU29_(jeweiliges DaTUM)
CPU_Q4DE8NCOU30_(jeweiliges DaTUM)
CPU_Q4DE8NCOU31_(jeweiliges DaTUM)

und sehen jeweils so aus:
Servername Datum Uhrzeit CPU-Wert(Auslastung)
Q4DE8NCOJ23 11/09/2011 00:00 2
Q4DE8NCOJ23 11/09/2011 00:10 1
Q4DE8NCOJ23 11/09/2011 00:20 4
Q4DE8NCOJ23 11/09/2011 00:30 3
Q4DE8NCOJ23 11/09/2011 00:40 2
Q4DE8NCOJ23 11/09/2011 00:50 1
Q4DE8NCOJ23 11/09/2011 01:00 2
.
.
.


die Ausgabe sollte (muss aber nicht zwingend) im Ordner
D:\Charts\data
landen.
und so aussehen:
SID;Datum/Zeit;Q4DE8NCOJ23;Q4DE8NCOJ24;Q4DE8NCOJ25;Q4DE8NCOJ26;Q4DE8NCOJ27;Q4DE8NCOJ28;Q4DE8NCOU29;Q4DE8NCOU30;Q4DE8NCOU31
ABC;19.10.2011 00:00;6;10;2;3;0;1;7;1;3
ABC;19.10.2011 00:10;3;15;2;5;1;0;9;2;11
ABC;19.10.2011 00:20;1;9;0;2;1;2;2;11;5
ABC;19.10.2011 00:30;1;13;1;0;0;1;57;8;15
ABC;19.10.2011 00:40;0;5;0;1;2;1;2;1;1
ABC;19.10.2011 00:50;2;4;0;0;1;4;17;2;2

wobei sich im Normafall der Wert "ABC" sowie die erste Zeile nicht ändern.

die angepasste Batch sieht nun so aus:

@echo on &setlocal
REM #####################################
REM Setzen des Datums
REM #####################################
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set Cyear=%%c%%b%%a
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set DAY=%%a
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set MON=%%b
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set YEAR=%%c

set "Ordner=D:\Charts\quelle\"
set "inDatei=CPU_Q4DE8NCOJ23_%cyear%" & set "inDatei1="
set Output=3^>"aktuell_win.csv"

pushd "%Ordner%"

del "%Output%" 2>nul

for /f "delims=" %%i in ('dir /b /on "%inDatei%"') do if not defined inDatei1 set "inDatei1=%%i"
if not defined inDatei1 echo Keine passende Datei gefunden! & goto :eof
%Output% >nul <nul (


for /f usebackqtokens^=1-4 %%i in (%inDatei1%) do (


>&3 set/p=";%%j %%k;%%l"


for /f "skip=1 delims=" %%a in ('dir /b /on "%inDatei%"') do for /f tokens^=3 %%m in (' findstr /b /c:"%%j %%k" %%a ') do >&3 set/p=";%%m"


>&3 echo(


) )
popd

Ich gebs gern nochmal zu ... ich hab von batch soviel Ahnung wie vom Tischlern ... ich kann gerade so mit dem "Schleifpapier" umgehen, deswegen nehmts mir bitte nicht krumm wenn ich das ein oder andere ohne eine Erklärung nicht verstehe ;)
ggf. kann mir jemand die Zeilen etwas erklären ? face-wink
Member: bastla
bastla Nov 18, 2011 at 15:45:01 (UTC)
Goto Top
Hallo Landstreicher!

Einem Tischler wirst Du aber auch die genauen Maße Deines geplanten Eckregals mitteilen müssen ... face-wink

Versuch es damit:
@echo off &setlocal
for /f "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set "cyear=%%c%%b%%a" & set "DAY=%%a" & set "MON=%%b" & set "YEAR=%%c"  

set "Ordner=D:\Charts\quelle\"  
set "inDatei=CPU_Q4DE8NCOJ*_%cyear%" & set "inDatei1="  
set Output=3^>"D:\Charts\data\aktuell_win.csv"  

pushd "%Ordner%"  
del "%Output%" 2>nul  

for /f "delims=" %%i in ('dir /b /on "%inDatei%"') do if not defined inDatei1 set "inDatei1=%%i"  
if not defined inDatei1 echo Keine passende Datei gefunden! & goto :eof

%Output% <nul (
    >&3 set/p="SID;Datum/Zeit"  
    for /f "tokens=2 delims=_" %%d in ('dir /b /on "%inDatei%"') do >&3 set/p=";%%d"  
    >&3 echo(
    for /f skip^=1usebackqtokens^=1-4 %%i in (%inDatei1%) do (
        >&3 set/p="ABC;%%j %%k;%%l"  
        for /f "skip=1 delims=" %%a in ('dir /b /on "%inDatei%"') do for /f tokens^=4 %%m in (' findstr /c:"%%j %%k" %%a ') do >&3 set/p=";%%m"  
        >&3 echo(
) )
popd
Kurze Erklärung (eigentlich wäre ja PH zuständig face-wink):

In Zeile 5 ist der "*" wichtig - es sollen ja alle Dateien gefunden werden, die dem Muster "CPU_Q4DE8NCOJNummer_Datum" entsprechen.

In Zeile 8 wird in den Ordner mit den Quelldateien gewechselt - damit muss in weiterer Folge kein Pfad berücksichtigt werden.

Die Zeile 11 dient dazu, die erste Datei zu finden - aus dieser werden dann die Timestamps gelesen (und in allen anderen Dateien die dazu passenden Zeilen gesucht); diese Zeile könnte auch so aussehen:
for /f "delims=" %%i in ('dir /b /o-n "%inDatei%"') do set "inDatei1=%%i"
- in beiden Varianten geht es darum, eben nur die Datei mit der niedrigsten Nummer zu ermitteln.

Zeile 14 ist etwas knifflig - hier wird dafür gesorgt, dass die Ausgaben in der Zieldatei landen (dazu wird Ausgabekanal 3, der defaultmäßig keinem bestimmten Zweck zugeordnet ist, verwendet). Außerdem werden mit der Eingabeumleitung die in der Schleife verwendeten "set /p" mit der Simulation einer Eingabe versorgt (zum Thema "Mehrere Ausgaben in eine Zeile schreiben" gibt's auch ein einschlägiges Echo ohne Zeilenumbruch und ähnliche Spielereien).

In Zeile 15 wird der erste Teil der Überschriftenzeile erzeugt - die oben angesprochene Technik sorgt dafür, dass noch keine Zeilenschaltung geschrieben wird.
Zeile 16 ergänz die Überschrift um die Servernamen, die zu diesem Zweck per "dir" ermittelt und anhand der "_" isoliert werden.
Zeile 17 schließlich versorgt die Überschriftszeile mit der abschließenden Zeilenschaltung (in anderen Fällen wird gerne auch "echo." verwendet).

Zeile 18 legt fest, dass aus der ersten gefundenen Datei (nach Überspringen der Zeile 1 mit "Servername Datum Uhrzeit CPU-Wert(Auslastung)") zeilenweise die gesamten Informationen gelesen werden (stehen dann in %%i, %%j, %%k und %%l), damit in Zeile 19 alles außer dem Servernamen %%i nach dem "ABC;" in die Zieldatei geschrieben werden kann - wieder ohne abschließende Zeilenschaltung.

In Zeile 20 wird wieder per "dir" eine geordnete Liste der Quelldateien erzeugt, aber der erste Eintrag (die Datei %inDatei1% wurde ja schon behandelt) übersprungen. In den restlichen Dateien wird jeweils die sich aus Datum und Uhrzeit (%%j und %%k) ergebende Zeile gesucht und der interessierende Wert (= Token 4) ausgelesen und, samt einem ";" davor, in die Zieldatei geschrieben - wieder jeweils ohne Zeilenumbrucht - dieser folgt in der Zeile 21.

Schließlich wird noch in Zeile 23 das "pushd" (der Ordnung halber) rückgängig gemacht.

Grüße
bastla

P.S.: Ich kann für den Batch Zeilennummern nennen, denn ich habe ihn ja passend - und da Du ja (auch als "Nicht-Tischler") zumindest polieren können solltest, kannst Du das für den von Dir geposteten Code sicher auch noch nachholen ... face-wink
Member: Landstreicher
Landstreicher Nov 21, 2011 at 12:45:56 (UTC)
Goto Top
Hallo bastla,

vielen Dank ! es funktioniert wunderbar! Danke auch noch an pieh-ejdsch und alle anderen Beteidigten.

Das Endergebnis poste ich die Tage noch face-wink


Gruß Landstreicher
Member: Biber
Biber Nov 26, 2011 at 19:48:45 (UTC)
Goto Top
Moin Langverstreicher,

Zitat von @Landstreicher:
Das Endergebnis poste ich die Tage noch face-wink

Ich hatte mal eine flüchtige Bekannte, bei der dauerten die Tage auch manchmal wochenlang.

Nun bemühe ich mich durchaus hier im Forum, das Gender-Bewusstsein zu schärfen und von daher auch dir eine längere Periode zu gönnen, aber....

Magst du nicht zumindest den Beitrag auf "Hinreichend beantwortet" setzen?

Zum Dank würde ich am nächsten Sonntag eine Kerze anzünden.

Grüße
Biber
Member: Landstreicher
Landstreicher Dec 13, 2011 at 09:50:17 (UTC)
Goto Top
Hallo,

war auf Dienstreise, daher etwas verspätet mal mein fertiges Batch face-wink

@echo off&setlocal

REM Darstellung der CPU-Auslastung Windowsserver

title Performance Windowsserver
REM #####################################
REM		Setzen des Datums
REM #####################################
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set Cyear=%%c%%b%%a  
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set DAY=%%a  
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set MON=%%b  
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set YEAR=%%c  

REM #####################################
REM		Setzen der Zeit
REM #####################################
set hh=%TIME:~0,2%
set mm=%TIME:~3,2%
set ss=%TIME:~6,2%

REM #####################################
REM		Setze Serverlist
REM #####################################
set servera=Q4DE8NCO*
set SID=DKS

REM #####################################
REM		Setzen der Pararmeter
REM #####################################
set Java="C:\Program Files\Java\jre6\bin\java.exe"  
set ChartMaker=D:\Charts\bin\
set Datadir=D:\Charts\data\
set PNGdir=D:\Charts\data\PNG\
set INIdir=D:\Charts\ini\
set Quelle=D:\Charts\quelle\"   
set OutFile=aktuell_win.csv
set Output=3^>"%datadir%%Outfile%"  
set PngFile=aktuell_win.png
set IniFile=chart_win.ini
set "inDatei=CPU_Q4DE8NCO*_%cyear%" & set "inDatei1="  

REM #####################################
REM		Check Verzeichnisse
REM #####################################
if not exist %Chartmaker% mkdir %Chartmaker%
if not exist %Datadir% mkdir %Datadir%
if not exist %PNGdir% mkdir %PNGdir%
if not exist %INIdir% mkdir %INIdir%

REM #####################################
REM		Baue OutFile
REM #####################################
pushd "%quelle%"  
del "%Output%" 2>nul  

for /f "delims=" %%i in ('dir /b /on "%inDatei%"') do if not defined inDatei1 set "inDatei1=%%i"  
if not defined inDatei1 echo Keine passende Datei gefunden! & goto :eof

%Output% <nul (
    >&3 set/p="SID;Datum/Zeit"  
    for /f "tokens=2 delims=_" %%d in ('dir /b /on "%inDatei%"') do >&3 set/p=";%%d"  
    >&3 echo(
    for /f skip^=1usebackqtokens^=1-4 %%i in (%inDatei1%) do (
        >&3 set/p="%sid%;%%j %%k;%%l"  
        for /f "skip=1 delims=" %%a in ('dir /b /on "%inDatei%"') do for /f tokens^=4 %%m in (' findstr /c:"%%j %%k" %%a ') do >&3 set/p=";%%m"  
        >&3 echo(
) )
popd
call %ChartMaker%ersetze.bat
REM #####################################
REM		Baue Chart 
REM #####################################
cd %ChartMaker%
%JAVA% -jar %ChartMaker%ChartMaker.jar %Datadir%%Outfile% %PNGdir%%PngFile% %INIdir%%IniFile%
%PNGdir%%PngFile%

Da sich das Datum in der Ziel - Datei doch geändert hat musste ich die ersetze.bat anschließen drüberbügeln lassen ...

@echo off
setlocal enabledelayedexpansion
pushd "D:\Charts\data"  
REM #####################################
REM		Setzen des Datums
REM #####################################
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set Cyear=%%c%%b%%a  
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set DAY=%%a  
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set MON=%%b  
FOR /F "tokens=1,2,3,4 delims=/. " %%a in ('date/T') do set YEAR=%%c  

REM #####################################
REM		Setze Datei
REM #####################################

set "filename=aktuell_win.csv"  
set "tempfile=aktuell_win_.csv"  

REM #####################################
REM		lese erste Zeile aus
REM #####################################

for /F "delims=" %%i in (D:\Charts\data\aktuell_win.csv) do if not defined zeile set "zeile=%%i"  
echo %zeile% >%tempfile%

REM #####################################
REM  lese restliche Zeilen aus und bau um
REM #####################################

for /F "skip=1 tokens=1-13 delims=/;" %%a in (%filename%) do (  
set text=%%a;%%c.%%b.%%d;%%e;%%f;%%g;%%h;%%i;%%j;%%k;%%l;%%m
set text=!text:^|=;!
echo !text!>>%tempfile%
)


REM #####################################
REM  lösche altes File / benenne TEMP um
REM #####################################

del %filename%
ren %tempfile% %filename%
popd

das Ergebnis sieht dann so aus aktuell_win.csv
SID;Datum/Zeit;Q4DE8NCOJ23;Q4DE8NCOJ24;Q4DE8NCOJ25;Q4DE8NCOJ26;Q4DE8NCOJ27;Q4DE8NCOJ28 
DKS;12.12.2011 00:10;1;1;2;1;0;2;;;
DKS;12.12.2011 00:20;0;1;4;0;2;0;;;
DKS;12.12.2011 00:30;0;2;2;1;0;0;;;
DKS;12.12.2011 00:40;1;0;3;1;0;1;;;
DKS;12.12.2011 00:50;1;0;1;1;1;0;;;
DKS;12.12.2011 01:00;0;0;2;1;0;1;;;
DKS;12.12.2011 01:10;1;1;2;1;0;3;;;
DKS;12.12.2011 01:20;1;2;2;0;0;1;;;
(;;; <-- hier kommen noch 3 Server - CPU - Werte hinzu)

anschließend wird durch den Cchartmaker.jar eine CPU Kurve gebaut ...

vielen dank noch mal an alle Mitwirkenden face-wink

gruß Landstreicher
Member: Landstreicher
Landstreicher Dec 13, 2011 at 09:51:29 (UTC)
Goto Top
Nachtrag: ich bestehe auf meine angezündete Kerze face-wink
PS: wenn jemand optimierungsvorschläge hat ... nur zu bin ganz Ohr.
Member: Biber
Biber Dec 13, 2011 at 12:19:44 (UTC)
Goto Top
Moin Lahmschleicher face-wink


Zitat von @Landstreicher:
Nachtrag: ich bestehe auf meine angezündete Kerze face-wink
PS: wenn jemand optimierungsvorschläge hat ... nur zu bin ganz Ohr.
Da bist du aber haarscharf an einem -na ja, nicht Fall ins Bodenlose, aber zumindest dem Zurückholen auf den Boden der harten Tatsachen vorbeigeschrammt.
Gerade gestern abend habe ich noch ein paar feedbacklose Beiträge durchgeblättert und auch ein paar endgültig vaporisiert.
Deinen hatte ich auch in der Hand... *gg

Wie dem auch sei - du scheinst ein gutes Gefühl für das richtige Timing zu haben.

Ich werde deshalb am nächsten Sonntag gleich vier Kerzen für Dich anzünden. face-wink

Grüße
Biber