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
GELÖST

Zeilenweises Verarbeiten mehrerer Flatfiles in einem Batch-Skript mit Bordmitteln (Windows Shell)

Frage Entwicklung Batch & Shell

Mitglied: -jenzz-

-jenzz- (Level 1) - Jetzt verbinden

12.03.2009, aktualisiert 12:27 Uhr, 3662 Aufrufe, 8 Kommentare

Hallo liebe Gemeinde,

ich bin neu hier und wende mich mit einem Problem an euch, das ich einfach nicht in den Griff bekomme. Es sieht folgendermaßen aus:

Es soll eine automatische Verarbeitung mehrerer Flatfiles (ASCII) in einem definierten Verzeichnis stattfinden. Die Anzahl der Dateien innerhalb des Verzeichnisses sind im Vorfeld nicht bekannt, richten sich aber nach einem bestimmten Muster (TDWH*.*). Die Dateien werden täglich geliefert.

Mein Problem ist nun Folgendes: im Dateinamen der Flatfiles befindet sich eine Information, die ich in jede Zeile des entsprechenden Files an den Anfang (oder das Ende) stellen will. Ich habe schon von mehreren Seiten gehört, dass dies durch ein VBScript durchaus elegant machbar ist. Meine Herausforderung ist die, das mit den normalen Bordmitteln einer Windows Server 2003 - Installation hinzubekommen. Es gibt in dieser Umgebung keine PowerShell oder sonstige Tools, die extra installiert worden sind, d.h. sed-Befehle (usw.) sind nicht möglich.

Im Anschluß an die Bearbeitung dieser Dateien soll der (bearbeitete) Inhalt aller Dateien in eine neue Datei geschrieben werden, die dann zur Verarbeitung in ein DWH weiter gereicht wird.

Ich habe in diesem Forum schon ein paar Anleitungen durchgelesen, aber leider keine Lösung gefunden. Gibt es hier in diesem Kreise jemand, der mir an der Stelle weiter helfen kann?

Vielen Dank schon mal im Voraus!

Gruss,
-jenzz-
Mitglied: Biber
12.03.2009 um 12:45 Uhr
Moin -jenzz-,


willkommen im Forum.
Für die Wahl eines geeigneten Werkzeugs wäre es noch sinnvoll zu wissen, welcher Art der Inhalt der Flatfiles sein mag (mit/ohne Umlauten, Sonderzeichen, Zeichencode), wie die Namens-Konventionen für die neue Gesamt-Datei sein sollen und ob/wie die Einzel-Import-Flatfiles nach erfolgreicher Transformation behandelt werden sollen.

Die Krönung und der heimliche Wunschtraum eines jeden Fricklers hier im Forum wären natürlich 3 oder 4 Beispieldatenzeilen...

Grüße
Biber
Bitte warten ..
Mitglied: bastla
12.03.2009 um 13:03 Uhr
... und wenn Du dann auch noch das Geheimnis um "eine Information" im Dateinamen lüftest, sollte sich das per Batch (mit oder ohne VBScript-Unterstützung) machen lassen ...

Soll die ominöse "Information" übrigens tatsächlich in die einzelnen Dateien geschrieben werden, oder ev doch nur in den Zeilen der Gesamt-Datei aufscheinen?

Grüße
bastla

P.S.: Willkommen auch von mir ...
Bitte warten ..
Mitglied: -jenzz-
12.03.2009 um 13:35 Uhr
Hallo Biber, hallo Bastla.

Vielen Dank für den Willkommensgruß. Ich dachte mir schon, dass ihr zwei Euch dem annehmt. Ich habe schon viel von euch gelesen in diesem Forum. Und ehrlich gesagt, hatte ich gehofft, einen Rat von euch zu erhalten.

So, genug geschleimt, jetzt zum eigentlichen Problem.

Die Flatfiles sind in Unicode gehalten (also mit Umlauten, Sonderzeichen etc.) und sind im "Fixed width"-Format abgespeichert. Die neue Gesamtdatei soll im Prinzip jeden Datensatz der anderen Dateien enthalten, allerdings mit einem vorangestellten Teil aus dem jeweiligen Dateinamen. So ein Dateiname kann "TDWHre01.08-09-10" heißen, wobei nach dem Punkt das Lieferdatum steht. Der Teil re01 (heißt für jede Datei anders!) soll dann in jede Zeile der Datei eingefügt werden (vor den Datensatz oder dahinter ist egal, Hauptsache er ist drin). Falls das mit dem "delimited"-Statement zu schwierig ist, diese Information zu extrahieren, kann auch alles vor dem Punkt eingefügt werden und die Verarbeitungslogik im DWH-Prozess übernimmt das Abschneiden und Umformen. Die neue Gesamtdatei soll dann "TDWH.DAT" heißen.

Die originalen Datein sollen vor der Umwandlung in ein Archivverzeichnis kopiert werden. Das ist nicht weiter schwer. Nach einer erfolgreichen Verarbeitung aller Dateien (Bearbeiten und in neue Datei kopieren) können diese aus dem Originalverzeichnis gelöscht werden (auch kein Problem).

Zu erwähnen ist, dass solch simplen Befehle wie "xcopy" nicht funktionieren, d.h. ich arbeite mit dem "copy"-Befehl.

Um auf die Antwort von bastla zu reagieren: Die Verarbeitungslogik ist noch diskutierbar, allerdings soll dann in der Gesamtdatei die entsprechende Information in jeder Zeile hinterlegt sein. Es kommt nicht darauf an, dass diese Information auch in der originalen Datei hinterlegt wird. Ich dachte nur, dass dies einfacher wäre.

Ein kleines Beispiel:

Originaldatensatz aus der Datei TDWHre01.08-09-10 ("..." bedeutet, dass danach noch weitere Zeichen folgen, feste Anzahl an Zeichen in jeder Zeile):

TOS2120107110110000030009.09.2008 ...
TOS2120107110110000040009.09.2008 ...
TOS2120107110110000050009.09.2008 ...

In der Gesamtdatei soll es dann heißen:

re01TOS2120107110110000030009.09.2008 ...
re01TOS2120107110110000040009.09.2008 ...
re01TOS2120107110110000050009.09.2008 ...

Wobei wie gesagt sich das "re01" aus dem Namen der Datei ergibt und nicht zwingend vor der Zeile stehen muss. Es kann auch dahinter stehen (ist vielleicht sogar besser, damit sich die exakten Positionen der anderen Informationen nicht verändert).

Vielleicht ist das jetzt etwas deutlicher geworden, was ich machen möchte/muss.

Danke und Gruss,
-jenzz-
Bitte warten ..
Mitglied: bastla
12.03.2009 um 15:11 Uhr
Hallo -jenzz-!

Wäre demnach die Vorschrift für den einzufügenden Text "Verwende vom Teil des Dateinames vor dem ersten Punkt alles nach den ersten 4 Stellen"?

Grüße
bastla
Bitte warten ..
Mitglied: -jenzz-
12.03.2009 um 15:22 Uhr
Hallo bastla.

Ja, so kann man das ausdrücken. Im Grundprinzip geht es mir darum, zu erfahren, wie man solche Operationen mit den normalen Hausmitteln macht und ob das überhaupt möglich ist. Laut einer Aussage hier im Forum soll dies ja möglich sein, ich habe nur absolut keinen blassen Schimmer, wie so etwas aussehen könnte. Denn sämtliche Threads hier beziehen sich auf erweiterte Funktionen, die mir leider nicht zur Verfügung stehen.

Gruss,
-jenzz-
Bitte warten ..
Mitglied: bastla
12.03.2009 um 19:42 Uhr
Hallo -jenzz-!

Batch und Unicode ist keine sooo gute Kombination - daher etwas Unterstützung durch ein anderes "Hausmittel", nämlich VBScript:
01.
@echo off & setlocal 
02.
set "Verz=D:\Flatfiles" 
03.
set "Maske=TDWH*.*" 
04.
set "Gesamt=D:\TDWH.DAT" 
05.
 
06.
set "AI=%temp%\AddInfo.vbs" 
07.
> %AI% echo Set args=WScript.Arguments:Set fso=CreateObject("Scripting.FileSystemObject") 
08.
>>%AI% echo Set FI=fso.OpenTextFile(args(0),,,True):Set FO=fso.OpenTextFile(args(1),8,True,True) 
09.
>>%AI% echo Do Until FI.AtEndOfStream:FO.WriteLine FI.ReadLine^&args(2):Loop:FO.Close:FI.Close 
10.
 
11.
if exist "%Gesamt%" del "%Gesamt%" 
12.
for %%i in ("%Verz%\%Maske%") do call :ProcessFile "%%i" 
13.
::Ende des Hauptprogrammes 
14.
goto :eof 
15.
 
16.
:ProcessFile 
17.
for /f "delims=." %%a in ("%~nx1") do set "DName=%%a" 
18.
set "ReNr=%DName:~4%" 
19.
cscript //nologo %AI% %1 "%Gesamt%" "%ReNr%" 
20.
::ohne Unicode 
21.
::for /f "usebackq delims=" %%a in (%1) do >>"%Gesamt%" echo %%a %ReNr% 
22.
goto :eof
Bitte die Pfade in den Zeilen 2 und 4 anpassen (wobei Zeile 2 nicht mit einem "\" enden darf, auch wenn es ein Root-Verzeichnis wäre - daher zB für "D:\" nur "D:" schreiben) ...

Das Löschen der Ausgangsdateien und ev weitere nach der Erzeugung der Gesamt-Datei anfallende Arbeitsschritte können im Batch unmittelbar vor der Zeile "::Ende des Hauptprogrammes" eingefügt werden.
Nur als Demo dabei ist in Zeile 21 der Batchcode, mit dem die Verarbeitung im einfachsten Fall (Ausgangsdateien nicht Unicode, keine Sonderzeichen "&<>|" oder eine ungerade Anzahl von Anführungszeichen enthalten ) erfolgen könnte - falls Du testen willst, einfach zwei Unicode-Dateien per
type D:\Flatfiles\Unicode-Datei>D:\FlatfilesASCII\ASCII-Datei
"umspeichern", die Doppelpunkte vor der Zeile 21 entfernen, die Zeile 19 ("cscript ...") durch vorangestellte "::" deaktivieren und den Batch auf die Dateien im Ordner "D:\FlatfilesASCII" loslassen (indem dieser in Zeile 2 eingetragen wird).
Noch eine Frage: Welche Dateigröße (Zeilenanzahl) erreichen eigentlich die einzelnen Ausgangsdateien?

Grüße
bastla
Bitte warten ..
Mitglied: -jenzz-
13.03.2009 um 11:26 Uhr
Hallo bastla,

ich bin beeindruckt. Das Skript funktioniert anstandslos. Die nötigen Zwischenschritte füge ich dann an den entsprechenden Stellen ein.

Die Dateien werden in der Regel 1-5MB groß, in Extremfällen bis zu 10MB. Die Anzahl der Dateien variiert zwischen 5 und 50 pro Tag.

Könnte das ein Problem darstellen?

Gruss,
-jenzz-
Bitte warten ..
Mitglied: bastla
13.03.2009 um 12:24 Uhr
Hallo -jenzz-!

Kein Problem - ich war nur vorsichtshalber von sehr großen Dateien ausgegangen und verarbeite daher die Ausgangsdateien jeweils zeilenweise, anstatt sie gleich als Ganzes in den Speicher zu holen - der Performance-Unterschied würde aber vermutlich ohnehin nicht wirklich ins Gewicht fallen.

Grüße
bastla
Bitte warten ..
Neuester Wissensbeitrag
Microsoft

Lizenzwiederverkauf und seine Tücken

(5)

Erfahrungsbericht von DerWoWusste zum Thema Microsoft ...

Ähnliche Inhalte
Windows 7
gelöst Batch-Skript oder VBS Skript zum Sichern von Office Vorlagen (2)

Frage von Ceejaay zum Thema Windows 7 ...

Entwicklung
gelöst Mit Batch,VBS,Powershell Windows einrichten (1)

Frage von Justin98 zum Thema Entwicklung ...

Batch & Shell
gelöst Batch-Skript für Druckerzuweisung auf Terminalserver - Variablenproblem (3)

Frage von BirdyB zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
LAN, WAN, Wireless
FritzBox, zwei Server, verschiedene Netze (17)

Frage von DavidGl zum Thema LAN, WAN, Wireless ...

Windows Netzwerk
Windows 10 RDP geht nicht (16)

Frage von Fiasko zum Thema Windows Netzwerk ...

Windows Server
Outlook Verbindungsversuch mit Exchange (15)

Frage von xbast1x zum Thema Windows Server ...