Batch - Datei mit fixer Satzlänge erzeugen
Hi zusammen,
ich möchte aus einer CSV-Datei Informationen auslesen und die einzelnen Felder in eine neue Datei mit fixer Satzlänge schreiben. Das Auslesen der CSV habe ich hinbekommen, jetzt weiß ich nicht wie ich die unterschiedlich langen Felinhalte in eine Datei mit fixer Satzlänge ausgeben kann. Folgend meine Ausleseroutine:
Der Satzaufbau soll z.B. so aussehen:
anrede ab Position 1
nachname ab Position 30
vorname ab Position 60
strasse ab Position 90
usw.
Zu Berücksichtigen ist natürlich, dass zu lange CSV-Feldinhalte gekürzt werden müssen. Es ist dabei ausreichend immer auf Stellen 1-30 zu begrenzen.
Habt ihr mir hierfür einen Lösungsvorschlag?
Vielen Dank und viele Grüße
jojebo
ich möchte aus einer CSV-Datei Informationen auslesen und die einzelnen Felder in eine neue Datei mit fixer Satzlänge schreiben. Das Auslesen der CSV habe ich hinbekommen, jetzt weiß ich nicht wie ich die unterschiedlich langen Felinhalte in eine Datei mit fixer Satzlänge ausgeben kann. Folgend meine Ausleseroutine:
@echo on
set inDir=D:\input
set indexMsk=index_*.txt
set "Delim=,"
for %%F in ("%inDir%\%indexMsk%") do (
set INDEXliste=%%F
echo Indexliste gefunden: %%~nxF >>D:\log.txt
)
for /f "tokens=1-9 delims=%Delim%" %%a in (%INDEXliste%) do (
set "anrede=%%a"
set "nachname=%%b"
set "vorname=%%c"
set "strasse=%%d"
set "hausnr=%%e"
set "PLZ=%%f"
set "Ort=%%g"
set "LKZ=%%h"
set "filename=%%i"
REM muss ersetzt werden durch das Schreiben an bestimmte Position
echo %anrede%_%nachname%_%vorname%_%strasse%_%hausnr%_%PLZ%_%Ort%_%filename% >>D:\log.txt
)
anrede ab Position 1
nachname ab Position 30
vorname ab Position 60
strasse ab Position 90
usw.
Zu Berücksichtigen ist natürlich, dass zu lange CSV-Feldinhalte gekürzt werden müssen. Es ist dabei ausreichend immer auf Stellen 1-30 zu begrenzen.
Habt ihr mir hierfür einen Lösungsvorschlag?
Vielen Dank und viele Grüße
jojebo
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 166289
Url: https://administrator.de/forum/batch-datei-mit-fixer-satzlaenge-erzeugen-166289.html
Ausgedruckt am: 01.05.2025 um 00:05 Uhr
6 Kommentare
Neuester Kommentar
Hallo jojebo und willkommen im Forum!
Grundsätzliches vorweg: Damit das so funktioniert, wie Du es oben skiziert hast, brauchst Du entweder "
... ansonsten ist es eigentlich nur noch eine Frage, ob die Felder rechts- oder linksbündig benötigt werden - am Beispiel von Anrede mit 29 (30 - 1) Stellen und linksbündiger Ausrichtung:
Für ein rechtsbündiges Feld (sehe ich allerdings derzeit nicht) mit 12 Stellen sähe das so aus:
Näheres dazu mit "
Grüße
bastla
Grundsätzliches vorweg: Damit das so funktioniert, wie Du es oben skiziert hast, brauchst Du entweder "
setlocal enabledelayedexpansion
" und bei der Ausgabe die Schreibweise "!anrede!
" anstelle von "%anrede%
" oder ein Unterprogramm ...... ansonsten ist es eigentlich nur noch eine Frage, ob die Felder rechts- oder linksbündig benötigt werden - am Beispiel von Anrede mit 29 (30 - 1) Stellen und linksbündiger Ausrichtung:
set "Leer30= "
...
set "anrede=%%a%Leer30%"
...
echo !anrede:~0,29%!!nachname:~0,30!...
set "Wert=%Leer30%%%n"
....
echo !Wert:~-12!
set /?
" ...Grüße
bastla
Hallo Bastla,
ich habe ähnliche Herausforderung, jedoch finde und finde ich den Fehler nicht (bei jojebo scheint es ja zu klappen):
Mein Script:
@echo on
set inDir=C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\input
set indexMsk=west_batch_v1_test.txt
set "Delim=;"
for %%F in ("%inDir%\%indexMsk%") do (
set INDEXliste=%%F
echo Indexliste gefunden: %%~nxF >>C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\output\log_feste_satzbeschreibung.txt
)
for /f "tokens=1-2 delims=%Delim%" %%a in (%INDEXliste%) do (
REM Fürs Forum: die _ und ... stellen die leerzeichen dar...ging hier nicht anders / wusste nicht wie
set "Leer44="_______..."
set "Leer76="_______________... "
set "Leer108="_____________________... "
set "E008=%%a%Leer44%"
set "E009=%%b%Leer76%"
REM muss ersetzt werden durch das Schreiben an bestimmte Position
echo !E008:~44,75%!!E009:~76,107%! >>C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\output\log_feste_satzbeschreibung.txt
)
Die ersten Zeilen der Datei "west_batch_v1_test.txt":
E008;E009
3M Co.;*
AB Industrie;*
AB Köhler;*
AB Volvo;*
ABB Ltd.;*
Carrier Most;*
Meine Outputdatei:
Indexliste gefunden: west_batch_v1_test.txt
Mehr nicht...leider
Ich habe die Variablen schon mit nem Echo überprüft...die stimmen.
Bitte H I L F E ! ! !
Herzlichsten Dank im Voraus!
ich habe ähnliche Herausforderung, jedoch finde und finde ich den Fehler nicht (bei jojebo scheint es ja zu klappen):
Mein Script:
@echo on
set inDir=C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\input
set indexMsk=west_batch_v1_test.txt
set "Delim=;"
for %%F in ("%inDir%\%indexMsk%") do (
set INDEXliste=%%F
echo Indexliste gefunden: %%~nxF >>C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\output\log_feste_satzbeschreibung.txt
)
for /f "tokens=1-2 delims=%Delim%" %%a in (%INDEXliste%) do (
REM Fürs Forum: die _ und ... stellen die leerzeichen dar...ging hier nicht anders / wusste nicht wie
set "Leer44="_______..."
set "Leer76="_______________... "
set "Leer108="_____________________... "
set "E008=%%a%Leer44%"
set "E009=%%b%Leer76%"
REM muss ersetzt werden durch das Schreiben an bestimmte Position
echo !E008:~44,75%!!E009:~76,107%! >>C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\output\log_feste_satzbeschreibung.txt
)
Die ersten Zeilen der Datei "west_batch_v1_test.txt":
E008;E009
3M Co.;*
AB Industrie;*
AB Köhler;*
AB Volvo;*
ABB Ltd.;*
Carrier Most;*
Meine Outputdatei:
Indexliste gefunden: west_batch_v1_test.txt
Mehr nicht...leider
Ich habe die Variablen schon mit nem Echo überprüft...die stimmen.
Bitte H I L F E ! ! !
Herzlichsten Dank im Voraus!
Hallo LordStickstoff und willkommen im Forum!
Zunächst zu:
Ansonsten war der erste Satz meines obigen Kommentars so gemeint, dass Du mit
beginnen solltest ...
Noch als Anmerkung: Sinnvoll wäre es, nicht nur %inDir% und %indexMsk%, sondern auch %outDir% und zB %LogFile% zu verwenden ...
Schließlich: Deine erste "
[Edit] Da ich inzwischen etwas mehr Zeit hatte, mir das anzusehen:
Hinsichtlich der Ausgabe in Zeile 21 musst Du ggf noch nachbessern ...
[/Edit]
Grüße
bastla
Zunächst zu:
die _ und ... stellen die leerzeichen dar...ging hier nicht anders / wusste nicht wie
Verwende bitte sowohl für Code als auch Textbeispiele die passende ...Ansonsten war der erste Satz meines obigen Kommentars so gemeint, dass Du mit
@echo on & setlocal enabledelayedexpansion
Noch als Anmerkung: Sinnvoll wäre es, nicht nur %inDir% und %indexMsk%, sondern auch %outDir% und zB %LogFile% zu verwenden ...
Schließlich: Deine erste "
for
"-Schleife wäre nur dann passend, wenn in %indexMsk% Wildcards vorhanden wären (ansonsten würde ein "if exist
" ausreichen) - dann aber müsste die eigentliche Verarbeitung ebenfalls in diese Schleife aufgenommen oder als Unterprogramm aufgerufen werden.[Edit] Da ich inzwischen etwas mehr Zeit hatte, mir das anzusehen:
@echo off & setlocal enabledelayedexpansion
set "inDir=C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\input"
set "outDir=C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\output"
set "indexMsk=west_batch_v1_test.txt"
set "Log=log_feste_satzbeschreibung.txt"
set "Delim=;"
set "Leer44= "
set "Leer76= "
set "Leer108= "
del "%outDir%\%Log%" 2>nul
for %%F in ("%inDir%\%indexMsk%") do (
set "INDEXliste=%%~F"
echo Indexliste gefunden: %%~nxF
for /f "usebackq tokens=1-2 delims=%Delim%" %%a in ("!INDEXliste!") do (
set "E008=%%a%Leer44%"
set "E009=%%b%Leer76%"
echo !E008:~0,44!!E009:~0,76!
)
)>>"%outDir%\%Log%"
[/Edit]
Grüße
bastla
Hallo Bastla,
vielen Dank für Deine Unterstützung...das Script läuft schon ein wenig besser, aber...
Anscheinend geht er alle Datensätze durch (s.n. Ausschnitt), aber er füllt mir dies nicht mit dem Inhalt aus der Input-Datei.
Auch sind die Einträge nicht an 44 bzw. 76. Stelle sondern exakt so wie oben der Ausschnitt.
Hast du noch eine Idee Bastla?
Dank dir vielmals im Voraus!
vielen Dank für Deine Unterstützung...das Script läuft schon ein wenig besser, aber...
Anscheinend geht er alle Datensätze durch (s.n. Ausschnitt), aber er füllt mir dies nicht mit dem Inhalt aus der Input-Datei.
Indexliste gefunden: west_batch_v2_test.txt
E008:~44,75~76,107
E008:~44,75~76,107
E008:~44,75~76,107
E008:~44,75~76,107
E008:~44,75~76,107
Auch sind die Einträge nicht an 44 bzw. 76. Stelle sondern exakt so wie oben der Ausschnitt.
Hast du noch eine Idee Bastla?
Dank dir vielmals im Voraus!
Hallo LordStickstoff!
Bei mir sieht der Testlauf (in der CMD-Shell mit dem oben geposteten Batch - als "MakeCSV.cmd" gespeichert - und Ausgabe der Inhalte der beiden Dateien) so aus:
Die Spalte für E008 ist 44 Zeichen breit, für E009 werden 76 Zeichen ausgegeben.
Beachte dabei bitte die Schreibweise in der Zeile 21 des Batches - mit "
Grüße
bastla
Bei mir sieht der Testlauf (in der CMD-Shell mit dem oben geposteten Batch - als "MakeCSV.cmd" gespeichert - und Ausgabe der Inhalte der beiden Dateien) so aus:
D:\>type C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\input\west_batch_v1_test
.txt
E008;E009
3M Co.;*
AB Industrie;*
AB K÷hler;*
AB Volvo;*
ABB Ltd.;*
Carrier Most;*
D:\>MakeCSV.cmd
D:\>type C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\output\log_feste_satzbes
chreibung.txt
Indexliste gefunden: west_batch_v1_test.txt
E008 E009
3M Co. *
AB Industrie *
AB K÷hler *
AB Volvo *
ABB Ltd. *
Carrier Most *
D:\>
Beachte dabei bitte die Schreibweise in der Zeile 21 des Batches - mit "
E008:~44,75
" (wie es Deine Darstellung oben enthält) würdest Du die Anweisung geben, die ersten 44 Zeichen des Inhaltes von %E008% zu überspringen und dann die nächsten 75 Zeichen auszugeben ...Grüße
bastla