Mehrere TXT-Files Zeilenweise auslesen, zusammensetzen und in CSV datei schreiben
Landstreicher (Level 1) - Jetzt verbinden
09.11.2011, aktualisiert 18.10.2012, 5685 Aufrufe, 23 Kommentare
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
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
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
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
23 Antworten
- LÖSUNG Jochem schreibt am 09.11.2011 um 14:59:10 Uhr
- LÖSUNG Jochem schreibt am 09.11.2011 um 15:00:29 Uhr
- LÖSUNG Landstreicher schreibt am 09.11.2011 um 15:30:26 Uhr
- LÖSUNG Jochem schreibt am 09.11.2011 um 16:04:35 Uhr
- LÖSUNG Landstreicher schreibt am 11.11.2011 um 12:25:29 Uhr
- LÖSUNG 60730 schreibt am 09.11.2011 um 16:51:57 Uhr
- LÖSUNG Landstreicher schreibt am 11.11.2011 um 12:14:11 Uhr
- LÖSUNG pieh-ejdsch schreibt am 10.11.2011 um 17:11:41 Uhr
- LÖSUNG Landstreicher schreibt am 11.11.2011 um 11:41:19 Uhr
- LÖSUNG pieh-ejdsch schreibt am 11.11.2011 um 14:16:46 Uhr
- LÖSUNG pieh-ejdsch schreibt am 11.11.2011 um 22:35:25 Uhr
- LÖSUNG Landstreicher schreibt am 14.11.2011 um 12:29:10 Uhr
- LÖSUNG bastla schreibt am 16.11.2011 um 20:23:17 Uhr
- LÖSUNG Landstreicher schreibt am 17.11.2011 um 13:44:25 Uhr
- LÖSUNG 60730 schreibt am 17.11.2011 um 14:50:07 Uhr
- LÖSUNG bastla schreibt am 17.11.2011 um 14:59:10 Uhr
- LÖSUNG Landstreicher schreibt am 18.11.2011 um 09:56:44 Uhr
- LÖSUNG bastla schreibt am 18.11.2011 um 16:45:01 Uhr
- LÖSUNG Landstreicher schreibt am 21.11.2011 um 13:45:56 Uhr
- LÖSUNG Biber schreibt am 26.11.2011 um 20:48:45 Uhr
- LÖSUNG Landstreicher schreibt am 13.12.2011 um 10:50:17 Uhr
- LÖSUNG Landstreicher schreibt am 13.12.2011 um 10:51:29 Uhr
- LÖSUNG Biber schreibt am 13.12.2011 um 13:19:44 Uhr
- LÖSUNG Landstreicher schreibt am 13.12.2011 um 10:51:29 Uhr
- LÖSUNG Landstreicher schreibt am 13.12.2011 um 10:50:17 Uhr
- LÖSUNG Biber schreibt am 26.11.2011 um 20:48:45 Uhr
- LÖSUNG Landstreicher schreibt am 21.11.2011 um 13:45:56 Uhr
- LÖSUNG bastla schreibt am 18.11.2011 um 16:45:01 Uhr
- LÖSUNG Landstreicher schreibt am 18.11.2011 um 09:56:44 Uhr
- LÖSUNG Landstreicher schreibt am 17.11.2011 um 13:44:25 Uhr
- LÖSUNG bastla schreibt am 16.11.2011 um 20:23:17 Uhr
- LÖSUNG Landstreicher schreibt am 14.11.2011 um 12:29:10 Uhr
- LÖSUNG pieh-ejdsch schreibt am 11.11.2011 um 22:35:25 Uhr
- LÖSUNG pieh-ejdsch schreibt am 11.11.2011 um 14:16:46 Uhr
- LÖSUNG Landstreicher schreibt am 11.11.2011 um 11:41:19 Uhr
- LÖSUNG Jochem schreibt am 09.11.2011 um 16:04:35 Uhr
- LÖSUNG Landstreicher schreibt am 09.11.2011 um 15:30:26 Uhr
LÖSUNG 09.11.2011 um 14:59 Uhr
Moin,
nach dem ersten Drübergucken: Kann so nicht funktionieren!
- 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
chem
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
LÖSUNG 09.11.2011 um 15:30 Uhr
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 ? ;)
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 ? ;)
LÖSUNG 09.11.2011 um 16:04 Uhr
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.
LÖSUNG 09.11.2011, aktualisiert 18.10.2012
Moinsen,
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ß
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ß
LÖSUNG 10.11.2011 um 17:11 Uhr
moin,
als CMD-OneLiner geht es vllt so
Gruß Phil
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="
LÖSUNG 11.11.2011 um 11:41 Uhr
danke erstmal Phil, aber sorry, ich komm damit echt nicht klar 
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
mfg
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
mfg
LÖSUNG 11.11.2011, aktualisiert 18.10.2012
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ß
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.
LÖSUNG 11.11.2011 um 12:25 Uhr
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
chem
> 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.
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
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
LÖSUNG 11.11.2011 um 14:16 Uhr
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
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
LÖSUNG 11.11.2011 um 22:35 Uhr
Ohne die Call, Sub oder delayedexpansion sähe das ganze in etwa so aus.
Gruß Phil
@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(
) )
LÖSUNG 14.11.2011 um 12:29 Uhr
LÖSUNG 16.11.2011 um 20:23 Uhr
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:
Hier genügt es, den Ordner und die Dateimaske anzugeben ...
Grüße
bastla
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
Grüße
bastla
LÖSUNG 17.11.2011 um 13:44 Uhr
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
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
LÖSUNG 17.11.2011 um 14:50 Uhr
moin,
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ß
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"
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ß
LÖSUNG 17.11.2011 um 14:59 Uhr
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
keine Ausgabe der Werte aus den übrigen Dateien erzeugt ...
Grüße
bastla
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="
Grüße
bastla
LÖSUNG 18.11.2011 um 09:56 Uhr
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 ?
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 ?
LÖSUNG 18.11.2011 um 16:45 Uhr
Hallo Landstreicher!
Einem Tischler wirst Du aber auch die genauen Maße Deines geplanten Eckregals mitteilen müssen ...
Versuch es damit:
Kurze Erklärung (eigentlich wäre ja PH zuständig
):
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:
- 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 Tutorial).
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 formatiert - 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 ...
Einem Tischler wirst Du aber auch die genauen Maße Deines geplanten Eckregals mitteilen müssen ...
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
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"
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 Tutorial).
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 formatiert - 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 ...
LÖSUNG 21.11.2011 um 13:45 Uhr
LÖSUNG 26.11.2011 um 20:48 Uhr
Moin Langverstreicher,
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
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
LÖSUNG 13.12.2011 um 10:50 Uhr
Hallo,
war auf Dienstreise, daher etwas verspätet mal mein fertiges Batch
Da sich das Datum in der Ziel - Datei doch geändert hat musste ich die ersetze.bat anschließen drüberbügeln lassen ...
das Ergebnis sieht dann so aus aktuell_win.csv
(;;; <-- 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
gruß Landstreicher
war auf Dienstreise, daher etwas verspätet mal mein fertiges Batch
@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%
@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
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;;;
anschließend wird durch den Cchartmaker.jar eine CPU Kurve gebaut ...
vielen dank noch mal an alle Mitwirkenden
gruß Landstreicher
LÖSUNG 13.12.2011 um 10:51 Uhr
LÖSUNG 13.12.2011 um 13:19 Uhr
Moin Lahmschleicher 
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.
Grüße
Biber
Zitat von @Landstreicher:
Nachtrag: ich bestehe auf meine angezündete Kerze
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.Nachtrag: ich bestehe auf meine angezündete Kerze
PS: wenn jemand optimierungsvorschläge hat ... nur zu bin ganz Ohr.
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.
Grüße
Biber