concertlive
Goto Top

Brauche ein Script um einfache Textdateien zusammenzufuegen

Folgendes Problem:

möchte Textdatein zusammenfügen und dabei den Inhalt etwas umbenennen - wer wüßte ein Programm das sowas macht .... oder könnte mir mit einem Script hierzu weiterhelfen?

Folgendes Problem:

möchte Textdatein zusammenfügen und dabei den Inhalt etwas umbenennen - wer wüßte ein Programm das sowas macht .... oder könnte mir mit einem Script hierzu weiterhelfen?


Ausgangssituation:

habe Text-Dateien die folgendermaßen aufgebaut sind:


Namen der Dateien:

15060950.stx
15061010.stx
etc.

dabei sind die ersten 4 Zahlen Datum und Uhrzeit 15060950 = 15.06. 09:50 Uhr (also: ddmmhhmm)


der Inhalt der Textdateien sind Pfade zu Dateien:

zb.: Inhalt von Datei 15060950.stx

C:\Daten\Ordner1\datei-1.cat
C:\Daten\Ordner2\datei-2.cat
C:\Daten\Ordner3\datei-3.cat


zb.: Inhalt von DAtei 15061010.stx

C:\Daten\Ordner4\datei-4.cat
C:\Daten\Ordner5\datei-5.cat
C:\Daten\Ordner6\datei-6.cat


nun möchte ich die Dateien und deren Inhalte folgendermaßen zusammenfügen - in eine Datei mit neuem Namen, der alle Dateien mit gleichem Datum von oben zusammenfasst, die Pfade sollen dann chronologisch untereinander geschrieben werden:

neue Name: 150608t1.log (bedeutet: 15.06.08 und zusätzlich die benötigte Ergänzung t1.log )

dabei soll die neue Datei so aufgebaut sein:


die Uhrzeit soll vorangestellt werden und belegt die Position 1-5, danach 4 Leerzeichen, danach ab Position 10 der Dateiname ohne Pfadangabe und ohne Dateiendung:


09:50 datei-1
09:50 datei-2
00:50 datei-3
10:10 datei-4
10:10 datei-5
10:10 datei-6
etc.


... dieser Vorgang sollte automatisch laufen / oder wir manuell angestoßen und sodass man die täglich anfallenden Einzeldateien zu einer Tagesatei zusammenfasst / wünschenswert wäre die Möglichkeit auf Details Zugriff zu haben, wenn man mal wieder etwas ändern mächte ... zb. Pfade etc. (ich denke ein script dessen code ersichtlich ist würde diesen Zugriff bei Bedarf gestatten)


Ein ganz herzliches Dankeschön erstmal für jede Hilfe ... gerne würde ich auch nochmals nähere Beschreibungen telefonisch geben.

Matthias

[Edit Biber] Von "Java" nach "Batch und Shell" verschoben. [/Edit]

Content-Key: 89894

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

Printed on: May 7, 2024 at 12:05 o'clock

Member: bastla
bastla Jun 15, 2008 at 18:36:28 (UTC)
Goto Top
Hallo concertlive und willkommen im Forum!

Da Du nach einem "Programm oder Script" fragst, könnte ich Dir, obwohl Du den Bereich "Java" gewählt hast, einen Batch anbieten:
@echo off & setlocal
set "Quelle=D:\Ordner mit stx-Dateien"  
set "QTyp=stx"  
set "Ziel=D:\Ordner mit log-Dateien"  
set "ZTyp=t1.log"  
set Jahr=08

if not exist "%Ziel%" md "%Ziel%"  
for /f "delims=" %%i in ('dir /b /on "%Quelle%\*.%QTyp%"') do call :ProcessFile "%Quelle%\%%i"  
goto :eof

:ProcessFile
set "Name=%~n1"  
set "Tag=%Name:~,4%  
set "Std=%Name:~4,2%  
set "Min=%Name:~6,2%  
for /f "usebackq delims=" %%d in (%1) do (echo %Std%:%Min%    %%~nd)>>"%Ziel%\%Tag%%Jahr%%ZTyp%"  
goto :eof
Voraussetzung für das Funktionieren ist, dass im Quelldateinamen Tag, Monat, Stunde und Minute immer zweistellig geschrieben sind, da auf dieser Basis im Unterprogramm ":ProcessFile" die Zerlegung des Dateinamens (%~n1) in die einzelnen Bestandteile erfolgt.

Die Angabe des Jahres könnte zwar auch variabel erfolgen, aber da mir die näheren Umstände der Ausführung (Zusammenfassung der Einzeldateien noch am selben Tag, am nächsten Tag, einmal in der Woche / im Monat - wäre übrigens mit dem geposteten Lösungsvorschlag möglich) nicht bekannt sind, wird das Jahr als Konstante festgelegt.

Zu überlegen wäre übrigens auch noch, was mit den Quelldateien geschehen soll, nachdem die Inhalte in die Zieldatei übernommen wurden (in der derzeitigen Fassung wird bei der nächsten Ausführung des Scripts die entsprechende Zieldatei um die Daten der dann - noch - vorhandenen Quelldateien des jeweiligen Tages ergänzt), bzw, ob die Zieldatei bei jedem Start des Scripts neu (aus allen dann vorhandenen Quelldateien) erstellt werden soll - dann könnten die Quelldateien auch unverändert erhalten bleiben.

Grüße
bastla
Member: concertlive
concertlive Jun 15, 2008 at 19:51:32 (UTC)
Goto Top
hallo bastla,

nach dem ersten test bin ich schier vom hocker gefallen !!! das hast Du genial gemacht ... und ich dachte schon aus meiner beschreibung wird niemand klar ... einfach super !!

anfangs gab es noch probleme, da bei rauskopieren von hier noch leerzeichen drin waren und die werden 1:1 übernommen .. hab es aber gleich gemerkt und wieder angepaßt ..

der konvert soll ca. täglich angestoßen werden - aber das mit dem Jahr als konstante ist ja kein großes problem ... einen jahreswechsel haben wir alle 365 tage und dann schreibt man einfach ein 2009er-script mit eingefügter 09

alte quelldateien lösche ich von zeit zu zeit weg ... und dass das script über die neuen (sprich zukünftigen) immer wieder drübergeht ist OK ... es könnten sich ja daten verändert haben oder neue quelldaten zu anderen zeiten pro tag hinzugekommen sein ....

eine bitte vielleicht noch weil der code mir doch etwas "spanisch" ist:

wie würde es aussehen wenn das sceipt an der stelle 10 in der zieldatei doch den ganzen pfad der datei schreibt, bloß die dateiendung .cat in die endung .dxx austauscht?

Ansonsten nochmals: vielen vielen DANK Dir

Matthias
Member: bastla
bastla Jun 15, 2008 at 20:06:10 (UTC)
Goto Top
Hallo concertlive!

wie würde es aussehen wenn das sceipt an der stelle 10 in der zieldatei doch den ganzen pfad der datei schreibt, bloß die dateiendung .cat in die endung .dxx austauscht?
Die Zeile 17 würde sich ändern auf
for /f "usebackq delims=" %%d in (%1) do (echo %Std%:%Min%    %%~dpnd.dxx)>>"%Ziel%\%Tag%%Jahr%%ZTyp%"   
Anstelle nur des Namens ("%%~nd") wird mit "%%~dpnd" auch "drive" und "path" mit ausgegeben (und die neue Endung hinzugefügt).

alte quelldateien lösche ich von zeit zu zeit weg ... und dass das script über die neuen (sprich zukünftigen) immer wieder drübergeht ist OK ... es könnten sich ja daten verändert haben oder neue quelldaten zu anderen zeiten pro tag hinzugekommen sein ....
Wenn die bereits übernommenen Dateien beim nächsten Start des Scripts noch vorhanden sind, wirst Du deren Inhalte doppelt in der Zieldatei vorfinden - insofern wäre es vielleicht sinnvoll, die ".stx"-Dateien zb durch das Hinzufügen eines ".done" an den Dateinamen als "verarbeitet" zu kennzeichnen, ohne sie sofort löschen oder verschieben zu müssen - soferne eine bereits erstellte ".stx"-Datei nachträglich nicht nochmals (durch das erstellende Programm) verändert wird, wäre dies ein gangbarer Weg.

Falls Du das Umbenennen testen möchtest, füge nach Zeile 17 noch hinzu:
ren %1 "%~1.done">nul  
Grüße
bastla
Member: concertlive
concertlive Jun 15, 2008 at 20:41:11 (UTC)
Goto Top
hallo bastla,

komplette pfade + andere Dateiendung klappt!

bloß:
bei ren %1 "%~1.done">nul kommt syntaxfehler ... und geht somit nicht - irgendwas ist da noch faul.....

aber die idee ist gut - habe tatsächlich bemerkt dass er am ende der datei beim erneuten ausführen des scripts wieder alles reinschreibt/hinzufügt (was nicht sein darf) - aber da die stx-dateien nur in eine richtung erstellt werden und vom erstellenden programm nicht gelesen werden, können diese gerne umbenannt werden ... oder gar gelöscht ... (wäre vielleicht gut beides in der schublade zu haben )


nochmals verbindlichsten Dank
Member: bastla
bastla Jun 15, 2008 at 20:52:33 (UTC)
Goto Top
Hallo concertlive!

Nochmals als vollständige Version:
@echo off & setlocal
set "Quelle=D:\Ordner mit stx-Dateien"  
set "QTyp=stx"  
set "Ziel=D:\Ordner mit log-Dateien"  
set "ZTyp=t1.log"  
set Jahr=08

if not exist "%Ziel%" md "%Ziel%"  
for /f "delims=" %%i in ('dir /b /on "%Quelle%\*.%QTyp%" 2^>nul') do call :ProcessFile "%Quelle%\%%i"  
goto :eof

:ProcessFile
set "Name=%~n1"  
set "Tag=%Name:~,4%  
set "Std=%Name:~4,2%  
set "Min=%Name:~6,2%  
for /f "usebackq delims=" %%d in (%1) do (echo %Std%:%Min%    %%~dpnd.dxx)>>"%Ziel%\%Tag%%Jahr%%ZTyp%"  
ren %1 "%~nx1.done"  
::del %1
goto :eof
Umbenennen sollte jetzt auch klappen (hatte vorher beim neuen Dateinamen noch den Pfad dabei, jetzt wird nur noch Name und Extension sowie der Zusatz ".done" verwendet), und wenn Du tatsächlich löschen willst, kannst Du anstelle der "ren"-Zeile (18) die "del"-Zeile (19) verwenden - mit "::" am Beginn der Zeile wird diese auskommentiert, sodass Du die Doppelpunkte nur in die jeweils nicht benötigte Zeile setzen musst.

Grüße
bastla
Member: concertlive
concertlive Jun 15, 2008 at 21:53:30 (UTC)
Goto Top
bastla es ist ein traum !!

Dein Script ist GENIAL ....

Danke Dir tausendmal ...

Es ist super nett dass Du Dir die Zeit und die Mühe genommen hast .... ich hoffe das Du hier noch ebensoviel Hilfe für eventuelle Fragen deinerseits bekommast !!

Liebe Grüße
Matthias