jojebo
Goto Top

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:
@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
) 
 
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

Content-Key: 166289

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

Printed on: April 19, 2024 at 02:04 o'clock

Member: bastla
bastla May 15, 2011 at 16:26:48 (UTC)
Goto Top
Hallo jojebo und willkommen im Forum!

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!...
Für ein rechtsbündiges Feld (sehe ich allerdings derzeit nicht) mit 12 Stellen sähe das so aus:
set "Wert=%Leer30%%%n"  
....
echo !Wert:~-12!
Näheres dazu mit "set /?" ...

Grüße
bastla
Member: jojebo
jojebo May 17, 2011 at 09:38:59 (UTC)
Goto Top
Hi bastla,

vielen Dank für die schnelle Antwort hat super funktioniert!

Grüße

jojebo
Member: LordStickstoff
LordStickstoff Jul 01, 2011 at 11:41:08 (UTC)
Goto Top
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 face-sad


Ich habe die Variablen schon mit nem Echo überprüft...die stimmen.


Bitte H I L F E ! ! !


Herzlichsten Dank im Voraus!
Member: bastla
bastla Jul 01, 2011 at 12:21:38 (UTC)
Goto Top
Hallo LordStickstoff und willkommen im Forum!

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
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 "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%"  
Hinsichtlich der Ausgabe in Zeile 21 musst Du ggf noch nachbessern ...
[/Edit]

Grüße
bastla
Member: LordStickstoff
LordStickstoff Jul 04, 2011 at 05:21:33 (UTC)
Goto Top
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.

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!
Member: bastla
bastla Jul 04, 2011 at 06:36:24 (UTC)
Goto Top
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:
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:\>
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 "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