Batch zur Umwandlung einer Datei nach fester Formatvorgabe
Hallo libe Helfer,
bin neu hier und leider auch neu in der Batchprgrammierung. Komme aus der Notes-Programmierung und bin bei folgender Aufgabe ratlos und bitte um Anregungen:
Ich habe eine Textdatei, die nach einer genauen Formatvorlage umzuwandeln ist. Die Inhalte sind dafür in bestimmte Felder mit fester Zeichenlänge vorgegeben. Ist ein Inhalt nicht lang genug muss er mit Leerzeichen aufgefüllt werden.
Zeile 1 und 2 der Datei sind korrekt und sollen nicht verändert werden.
Ab Zeile 3 geht's also los. Hier sind jeweils pro Datensatz die Felder von Zeichenposition 1-93 korrekt und müssen nicht verändert werden. Aber dann gehts los. Das Feld, das dann folgt, ist zu kurz. Er soll eine Länge von 27 Zeichen haben und muss also bis zur Zeichenposition 120 mit Leerzeichen aufgefüllt werden. Bisher folgt hier aber der Text, der ins nächste Feld soll direkt dran. Der Text der in dieses darauffolgende Feld soll, ist immer der gleiche. Man könnte also zur Trennung nehmen such ab Poition 94 bis dieser Text auftaucht, ermittle die Länge bis dorthin und fülle mit Leerzeichen auf bis 27 Zeichen erreicht sind.
Danach sind 8 weitere Leerzeichen einzufügen, bevor dann das nächste Feld beginnt, welches widerum 27 Zeichen lang sein soll, Dies ist das Feld, nennen wir es Firma, welches immer den gleichen Text enthält. Es muss auch bis auf 27 Zeichen mit Leerzeichen aufgefüllt werden.
Zum Schluss eines Datensatzes müssen noch 11 Leerzeichen angefügt werden
So muss die ganze Datei umgewandelt werden bis zur letzten Zeile. Diese darf ebenso wie Zeile 1 und 2 bei der Umwandlung nicht beachtet werde. An die letzte Zeile müssen dafür 51 Leerzeichen angehängt werden.
Zur Veranschaulichung, da die Beschreibung doch etwas konfus klingt, füge ich unten mal ein Beispiel an, wie die Struktur vor und nach der Umwandlung aussieht bzw. aussehen soll. Die Positionen 1-93 lasse ich mal aussen vor, da sie ja nicht verändert werden müssen.
Die Datei, welche umzuwandeln ist, sieht also ungefähr so aus:
Zeile1
Zeile2
Max MustermannFirmaxyz12345678Musterzweckbbbbbbbbbbbbbbbbabbccddeeeeeeeeeeeeeeeeeeeeeeeeeeffggggggggggggggggggggggggggg
Marie MustefrauFirmaxyz12345678Musterzweckbbbbbbbbbbbbbbbbabbccddeeeeeeeeeeeeeeeeeeeeeeeeeeffggggggggggggggggggggggggggg
Zeile Ende
Rauskommen soll dann aber sowas:
Zeile1
Zeile2
Max MustermannbbbbbbbbbbbbbbbbbbbbbFirmaxyzbbbbbbbbbbbbbbbbbbbMusterzweckbbbbbbbbbbbbbbbbabbccddeeeeeeeeeeeeeeeeeeeeeeeeeeffgggggggggggggggggggggggggggblankblankblankblankblankblankblankblankblankblankblank
Marie MusterfraubbbbbbbbbbbbbbbbbbbFirmaxyzbbbbbbbbbbbbbbbbbbbMusterzweckbbbbbbbbbbbbbbbbabbccddeeeeeeeeeeeeeeeeeeeeeeeeeeffgggggggggggggggggggggggggggblankblankblankblankblankblankblankblankblankblankblank
Zeile Ende mit 51 Blanks
Das Ganze soll dann über eine Batch oder Exe-Prozedur laufen.
Vielen Dank schon mal für jeden hilfreichen Hinweis.
Gruss Josh
bin neu hier und leider auch neu in der Batchprgrammierung. Komme aus der Notes-Programmierung und bin bei folgender Aufgabe ratlos und bitte um Anregungen:
Ich habe eine Textdatei, die nach einer genauen Formatvorlage umzuwandeln ist. Die Inhalte sind dafür in bestimmte Felder mit fester Zeichenlänge vorgegeben. Ist ein Inhalt nicht lang genug muss er mit Leerzeichen aufgefüllt werden.
Zeile 1 und 2 der Datei sind korrekt und sollen nicht verändert werden.
Ab Zeile 3 geht's also los. Hier sind jeweils pro Datensatz die Felder von Zeichenposition 1-93 korrekt und müssen nicht verändert werden. Aber dann gehts los. Das Feld, das dann folgt, ist zu kurz. Er soll eine Länge von 27 Zeichen haben und muss also bis zur Zeichenposition 120 mit Leerzeichen aufgefüllt werden. Bisher folgt hier aber der Text, der ins nächste Feld soll direkt dran. Der Text der in dieses darauffolgende Feld soll, ist immer der gleiche. Man könnte also zur Trennung nehmen such ab Poition 94 bis dieser Text auftaucht, ermittle die Länge bis dorthin und fülle mit Leerzeichen auf bis 27 Zeichen erreicht sind.
Danach sind 8 weitere Leerzeichen einzufügen, bevor dann das nächste Feld beginnt, welches widerum 27 Zeichen lang sein soll, Dies ist das Feld, nennen wir es Firma, welches immer den gleichen Text enthält. Es muss auch bis auf 27 Zeichen mit Leerzeichen aufgefüllt werden.
Zum Schluss eines Datensatzes müssen noch 11 Leerzeichen angefügt werden
So muss die ganze Datei umgewandelt werden bis zur letzten Zeile. Diese darf ebenso wie Zeile 1 und 2 bei der Umwandlung nicht beachtet werde. An die letzte Zeile müssen dafür 51 Leerzeichen angehängt werden.
Zur Veranschaulichung, da die Beschreibung doch etwas konfus klingt, füge ich unten mal ein Beispiel an, wie die Struktur vor und nach der Umwandlung aussieht bzw. aussehen soll. Die Positionen 1-93 lasse ich mal aussen vor, da sie ja nicht verändert werden müssen.
Die Datei, welche umzuwandeln ist, sieht also ungefähr so aus:
Zeile1
Zeile2
Max MustermannFirmaxyz12345678Musterzweckbbbbbbbbbbbbbbbbabbccddeeeeeeeeeeeeeeeeeeeeeeeeeeffggggggggggggggggggggggggggg
Marie MustefrauFirmaxyz12345678Musterzweckbbbbbbbbbbbbbbbbabbccddeeeeeeeeeeeeeeeeeeeeeeeeeeffggggggggggggggggggggggggggg
Zeile Ende
Rauskommen soll dann aber sowas:
Zeile1
Zeile2
Max MustermannbbbbbbbbbbbbbbbbbbbbbFirmaxyzbbbbbbbbbbbbbbbbbbbMusterzweckbbbbbbbbbbbbbbbbabbccddeeeeeeeeeeeeeeeeeeeeeeeeeeffgggggggggggggggggggggggggggblankblankblankblankblankblankblankblankblankblankblank
Marie MusterfraubbbbbbbbbbbbbbbbbbbFirmaxyzbbbbbbbbbbbbbbbbbbbMusterzweckbbbbbbbbbbbbbbbbabbccddeeeeeeeeeeeeeeeeeeeeeeeeeeffgggggggggggggggggggggggggggblankblankblankblankblankblankblankblankblankblankblank
Zeile Ende mit 51 Blanks
Das Ganze soll dann über eine Batch oder Exe-Prozedur laufen.
Vielen Dank schon mal für jeden hilfreichen Hinweis.
Gruss Josh
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 127932
Url: https://administrator.de/contentid/127932
Ausgedruckt am: 17.11.2024 um 00:11 Uhr
10 Kommentare
Neuester Kommentar
Servus,
das ganz ist aber wirklich kompliziert...
Als Denkansatz mal folgendes:
Aber...
Wer sagt dann der Batch, wo Sie
Mein rat - für das Problem - erstmal dafür sorgen dass die "ausgebende Stelle" irgendein Trennzeichen in dem Datensatzsalat drin ist - sonst wird das nüx.
Gruß
das ganz ist aber wirklich kompliziert...
Als Denkansatz mal folgendes:
Zeile 1 und 2 der Datei sind korrekt und sollen nicht verändert werden.
Dazu ist der Schalter Skip=2 in der For Schleife dein Freund.Aber...
Wer sagt dann der Batch, wo Sie
Max Mustermann
vonMarie Musterfrau
unterscheiden soll?Mein rat - für das Problem - erstmal dafür sorgen dass die "ausgebende Stelle" irgendein Trennzeichen in dem Datensatzsalat drin ist - sonst wird das nüx.
Gruß
Moin josken69,
willkommen im Forum.
Auch zum Thema "Exportdatei mit fester Satzlänge" haben wir hier bereits ein paar verwendbare Ansätze.
Eine Batchlösung (oder besser Batch-Herangehensweise) findest du z.B. hier: Exportdatei mit fester Satzlänge in CSV-Format konvertieren.
Ist also handwerklich auch durchaus mit vertretbarem Aufwand mit Batch zu lösen, allerdings würde ich die Wahl des Werkzeugs abhängig machen von
Kannst du dazu etwas sagen?
Grüße
Biber
willkommen im Forum.
Auch zum Thema "Exportdatei mit fester Satzlänge" haben wir hier bereits ein paar verwendbare Ansätze.
Eine Batchlösung (oder besser Batch-Herangehensweise) findest du z.B. hier: Exportdatei mit fester Satzlänge in CSV-Format konvertieren.
Ist also handwerklich auch durchaus mit vertretbarem Aufwand mit Batch zu lösen, allerdings würde ich die Wahl des Werkzeugs abhängig machen von
- der voraussichtlichen Häufigkeit der Konvertierung (einmalig/ 3x täglich/ permanent/ bis die SAP-Hansels eine stabile Version zusammengeschrotet haben...)
- dem Volumen der zu konvertierenden Datei(en). Sind das eher ein paar 100 oder ein paar 1000 Sätze oder eher über 100000 Sätze...?
- der voraussichtlichen Änderungshäufigkeit des Quell/Zielformats. Eine Batchdatei ist schnell und von jedem anpassbar, eine whatever-.Exe nicht.
Kannst du dazu etwas sagen?
Grüße
Biber
Servus,
mir leider nicht,
wenn das einzigste "Erkennungsmerkmal" einGroßer Buchstabe ist - dann ...
Gruß
Hilft das für weitere Hinweise?
mir leider nicht,
Max MustermannFirmaxyz12345678Musterzweckbbbbbbbbbbbbbbbbabbccddeeeeeeeeeeeeeeeeeeeeeeeeeeffggggggggggggggggggggggggggg
zwischen Max und Mustermann ist ein Leerzeichen - das ist "gut", aber hinter Mustermann ist sofort die Firma,wenn das einzigste "Erkennungsmerkmal" einGroßer Buchstabe ist - dann ...
Gruß
Moin josken69,
danke für die Rück-Info.
Ich denke, wenn es "nur" diese Dimensionen hat, dann schrubbeln wir da eine kurze Batch zusammen und gut.
Wie T-Mo gestern schon angedeutet hat, lässt sich mit einer FOR/F "delims=" -Anweisung diese Quelldatei Zeile für Zeile einlesen.
Eine Sonderbehandlung sollen die Zeilen 1, 2 und die letzte erhalten.
Okay, bis zwei können wir während der Verarbeitung selbst zählen, aber die Anzahl Gesamtzeilen sollten wir vorher ermitteln.
Dafür lässt sich eine FindStr /n FOR/F -kombination verwenden (Zähle Anzahl Zeilen, die irgendwas enthalten oder die etwas nicht enthalten)
Lösung für Ermittlung der letzten Zeile/Anzahl Zeilen also z.B. im Batch:
Der Rest kann schematisch nach dem Beispiel laufen, das ich gestern gepostet habe.
Grüße
Biber
danke für die Rück-Info.
Ich denke, wenn es "nur" diese Dimensionen hat, dann schrubbeln wir da eine kurze Batch zusammen und gut.
Wie T-Mo gestern schon angedeutet hat, lässt sich mit einer FOR/F "delims=" -Anweisung diese Quelldatei Zeile für Zeile einlesen.
Eine Sonderbehandlung sollen die Zeilen 1, 2 und die letzte erhalten.
Okay, bis zwei können wir während der Verarbeitung selbst zählen, aber die Anzahl Gesamtzeilen sollten wir vorher ermitteln.
Dafür lässt sich eine FindStr /n FOR/F -kombination verwenden (Zähle Anzahl Zeilen, die irgendwas enthalten oder die etwas nicht enthalten)
Lösung für Ermittlung der letzten Zeile/Anzahl Zeilen also z.B. im Batch:
@echo off & setlocal
Set "meineDatei=d:\eine\Rechnungsdatei.xyz"
FOR /F "delims=:" %%i in ('findstr /v /n "Ich wähle Tigerenten!" "%meineDatei%" ') do @set /a anz+=1
Echo Anzahl Zeilen in "%meineDatei%": %anz%.
...
Der Rest kann schematisch nach dem Beispiel laufen, das ich gestern gepostet habe.
Grüße
Biber
Moin josken69,
sorry für die späte Antwort.
Füge bitte mal in Zeile 8 die Option "usebackq" dazu.
Zeile 8 bisher:
Um der Frage zuvorzukommen: "usebackq" ist neudeutsch für "Mach es richtig".
Den Schalter vergess ich manchmal...
Grüße
Biber
sorry für die späte Antwort.
Füge bitte mal in Zeile 8 die Option "usebackq" dazu.
Zeile 8 bisher:
FOR /F "skip=1 delims=" ....
Zeile 8 neu:FOR /F "usebackq skip=1 delims=" ........
Um der Frage zuvorzukommen: "usebackq" ist neudeutsch für "Mach es richtig".
Den Schalter vergess ich manchmal...
Grüße
Biber
Moin josken69,
die etwas größer Herausforderung in der sich langsam konkretisierenden Aufgabenstellung ist der Punkt 2:
Bist du sicher, dass dieses Detail allen MitleserInnern von Anfang an hätte bekannt sein müssen?
Ärgerlich dabei ist, dass die CMD-Aarbeitung von Textdateien streng zeilenorientiert, stupide eine Zeile nach der anderen.
Immer unter der Annahme, dass auch eine Zeile wie jede andere strukturiert ist.
In deinem Fall müsste die Mimik (in einem Batchfile) entsprechend geändert werden von
jetzt:
in neu:
Können wir auch machen, aber...
ist es vertretbar für dich, mal so ein halbes dutzend Zeilen (ggf. anonymisiert) deiner Quelldatei zu posten mit einem Beispiel Input-Ist/Output-Soll.?
Zusatzfrage:
Kommt denn nicht ein "falsches" Ergebnis raus, wenn du die Gesamtzeilenanzahl so ermittelst:
Grüße
Biber
die etwas größer Herausforderung in der sich langsam konkretisierenden Aufgabenstellung ist der Punkt 2:
2. In der Ursprungsdatei gehören ab Zeile 2 immer 2 Zeilen zu einem Datensatz und sollen in der neuen Datei in einer Zeile erscheinen.
Wie entferne ich den CRLF in jeder zweiten Zeile?
Wie entferne ich den CRLF in jeder zweiten Zeile?
Bist du sicher, dass dieses Detail allen MitleserInnern von Anfang an hätte bekannt sein müssen?
Ärgerlich dabei ist, dass die CMD-Aarbeitung von Textdateien streng zeilenorientiert, stupide eine Zeile nach der anderen.
Immer unter der Annahme, dass auch eine Zeile wie jede andere strukturiert ist.
In deinem Fall müsste die Mimik (in einem Batchfile) entsprechend geändert werden von
jetzt:
Lese alle Zeilen von der zweiten an
Mache mit jeder Zeile ein call.processline
BissuFertigbistbeiZeileLetzteMinus1
Mache mit jeder Zeile ein call.processline
BissuFertigbistbeiZeileLetzteMinus1
in neu:
Lese alle Zeilen von der zweiten an
Mache mit jeder Zeile ein
WennEineEinsVonZweiZeile merkDirzeileEins
WennEineZweiVonZweiZeile mache ein :ProzesslineEinsUndZwei
BissuFertigbistbeiZeileLetzteMinus1
Mache mit jeder Zeile ein
WennEineEinsVonZweiZeile merkDirzeileEins
WennEineZweiVonZweiZeile mache ein :ProzesslineEinsUndZwei
BissuFertigbistbeiZeileLetzteMinus1
Können wir auch machen, aber...
ist es vertretbar für dich, mal so ein halbes dutzend Zeilen (ggf. anonymisiert) deiner Quelldatei zu posten mit einem Beispiel Input-Ist/Output-Soll.?
Zusatzfrage:
Kommt denn nicht ein "falsches" Ergebnis raus, wenn du die Gesamtzeilenanzahl so ermittelst:
FOR /F "delims=:" %%i in ('findstr /v /n "0128E" "%File%" ') do @set /a anz+=1
...und hinterher ALLE Zeilen verarbeitest?Grüße
Biber