marie-k
Goto Top

Mehrere GZ Dateien entpacken, umbennen und modifizieren

Einmal im Monat kommen mehrere GZ-Dateien per E-Mail, die für den Import nach Access vorbereitet werden müssen.

Teil 1)
Am Monatsanfang kommen mehrere GZ-Dateien im folgenden Format rein: Bereich_Monat-Jahr.gz
Darin enhalten ist jeweils eine Datei mit einem zufälligen Dateinamen: JJDFB_6357851.xls
Ziel ist es Datein zu erhalten, die folgenden Dateinamen haben: Bereich.txt
(Einfaches Umbennen reicht, es handelt sich nicht um echte xls-Dateien)

Teil 2)
Die Dateien enthalten am Anfang eine variable Zeilenanzahl Daten, die ich in Access nicht benötige, d.h. gelöscht werden sollten.
Die erste Zeile, die erhalten bleiben soll, beginnt stets mit "Logistikebene class_part".

Am besten bearbeitet die Batchdatei einfach alle GZ-Dateien im selben Verzeichnis (feste Pfadangaben wären hinderlich).

Ich schätze das ist sehr viel Anforderung auf einmal, zudem ich noch nie mit Batchprogrammierung zu tun hatte.
Aber ich bin wahnsinnig dankbar für jede Unterstützung!

Grüße,
Marie
Kommentar vom Moderator Biber am 21.04.2010 um 15:55:47 Uhr
Mehrere GZ Dateien entpacken, umbennen und modifizieren
Set /a rgc+=1
659
Einfaches Umbennen reicht...
Jepp, hätte mir auch gereicht...
Set /a rgc+=1
660

Content-Key: 141155

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

Ausgedruckt am: 29.03.2024 um 13:03 Uhr

Mitglied: laster
laster 21.04.2010 um 15:32:47 Uhr
Goto Top
Hallo Marie,

1. mit dem Programm 7-zip kannst Du die Datei entpacken
2. die Datei umbenennen
3. mit dem Befehl find kannst Du filtern, allerdings Zeilen mit einem bestimmten Inhalt übernehmen oder nicht.
7z e Bereich_Monat-Jahr.gz
ren *.xls bereich.txt
find "Text in zu uebernehmende Zeilen" bereich.txt > bereich.dat  

so ähnlich kann es werden.
Probieren, probieren ...

vG
LS
Mitglied: Marie-K
Marie-K 21.04.2010 um 17:17:10 Uhr
Goto Top
Hallo Laster,

der Tipp mit 7zip war gut. Ich habe daraufhin einen Kollegen gebeten mir etwas unter die Arme zu greifen und "Schritt 1" ist soweit auch erledigt. Nun ist er aber auch am Ende mit seinem Latein...

Der Quellcode sieht aktuell so aus:
FOR %%f in (*.gz) DO (
	7za e -y -so "%%f" > "%%~nf.txt"  
	)

Was noch fehlt ist "Schritt 2". Die erste Zeile, die erhalten bleiben soll, ist die Zeile mit den zukünftigen Spaltentiteln, danach folgen Daten.

Grüße,
Marie
Mitglied: Biber
Biber 21.04.2010 um 17:39:23 Uhr
Goto Top
Moin Marie-K,

willkommen im Forum.

zu dem 2. Schritt, zum "Überlesen" der ersten nicht benötigten Zeilen wäre eine der möglichen Strategien

  • innerhalb der oberen FOR-Anweisung oder auch nach kompletter Abarbeitung der ersten FOR-Anweisung danach in einer neuen FOR ..In (*.txt)-Anweisung
  • jeweils mit
{Find /n oder } Findstr /n "Logistikebene class_part" "%%~nxi"

die Zeilennummer des Suchtextes zu ermitteln. [Bitte am CMD-Prompt mit einer der Textdateien testen.]

  • Diese Zeilennummer in einer Variablen zu merken und diese Variable als "Skip"-Parameter für den Befehl MORE zu benutzen.
  • und somit mit "more +n dieTextdatei.txt > dieTextDatei.csv" zu erzeugen, die dann Access verarbeiten kann.

Du bekommst sicherlich ein wenig mehr Sicherheit beim Batchen, wenn du mal kurz am CMD-Prompt bei FOR /?, SET /?, FINDSTR /? und MORE/? recherchierst.
Oder hier im Bereich "Batch & Shell" sollte auch einiges zu finden sein zu "FindStr " oder "Zeilen überspringen Batch".

Wenn du steckenbleibst, helfen wir auch gerne weiter. Aber versuche es mal bitte - ist ein überschaubarer Umfang.

Grüße
Biber
Mitglied: 77559
77559 21.04.2010 um 17:43:13 Uhr
Goto Top
Moin moin,

Ich kann mich Bibers Ratschlägen nur anschließen.

Der Übersicht halber würde ich die Dateien in (ggfs temporäre) Unterverseichnisse entpacken.

Das sähe dann z.Bsp. so aus:
@Echo off
For /f "delims=" %%A in ('dir /B/A-D *.gz') do Call :Process "%%A" "%%~nA"  

Echo Done
goto :Eof

:Process
:: Name splitten
Set "Archiv=%~2"  
Set "Monat=%Archiv:*_=%"  
Call Set "Bereich=%%Archiv:_%Monat%=%%"  

Echo Dateiname: %~1
Echo Archiv   : %Archiv%
Echo Bereich  : %Bereich%
Echo Monat    : %Monat%

:: Entpacke in Unterordner
If Not Exist %Archiv% MD %Archiv%
7z e -o%Archiv% %1 *.xls
:: verarbeite *.XLS
For /F "Delims=" %%B in ('Dir /B/A-D .\%Archiv%\*.xls') Do Call :ProcXLS "%%~fB"  
:: Hier ggfs aufräumen: Unterordner löschen
goto :Eof

:ProcXLS
:: Ermittle Anfangszeile
for /f "delims=" %%C in (  
  'find /I /N "Logistikebene class_part" ^<%1'  
    ) Do Set /A "Offset=%%C-1"  
:: Gebe aus in neue Datei
More +%Offset% <%1 >"%Bereich%.txt"  
EinTest hier Anhand deiner Angaben funktionierte soweit.

Gruß
LotPings