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

Batch - Datei mit fixer Satzlänge erzeugen

Frage Entwicklung Batch & Shell

Mitglied: jojebo

jojebo (Level 1) - Jetzt verbinden

15.05.2011 um 18:07 Uhr, 3008 Aufrufe, 6 Kommentare

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:
01.
@echo on 
02.
 
03.
set inDir=D:\input 
04.
set indexMsk=index_*.txt 
05.
set "Delim=,"  
06.
 
07.
for %%F in ("%inDir%\%indexMsk%") do ( 
08.
set INDEXliste=%%F  
09.
echo Indexliste gefunden: %%~nxF >>D:\log.txt 
10.
11.
 
12.
for /f "tokens=1-9 delims=%Delim%" %%a in (%INDEXliste%) do (  
13.
 
14.
    set "anrede=%%a" 
15.
    set "nachname=%%b" 
16.
    set "vorname=%%c" 
17.
    set "strasse=%%d" 
18.
    set "hausnr=%%e" 
19.
    set "PLZ=%%f" 
20.
    set "Ort=%%g" 
21.
    set "LKZ=%%h" 
22.
    set "filename=%%i" 		 
23.
REM muss ersetzt werden durch das Schreiben an bestimmte Position 
24.
    echo %anrede%_%nachname%_%vorname%_%strasse%_%hausnr%_%PLZ%_%Ort%_%filename% >>D:\log.txt 
25.
)  
26.
 
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
Mitglied: bastla
15.05.2011 um 18:26 Uhr
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:
01.
set "Leer30=                              " 
02.
... 
03.
set "anrede=%%a%Leer30%" 
04.
... 
05.
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:
01.
set "Wert=%Leer30%%%n" 
02.
.... 
03.
echo !Wert:~-12!
Näheres dazu mit "set /?" ...

Grüße
bastla
Bitte warten ..
Mitglied: jojebo
17.05.2011 um 11:38 Uhr
Hi bastla,

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

Grüße

jojebo
Bitte warten ..
Mitglied: LordStickstoff
01.07.2011 um 13:41 Uhr
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!
Bitte warten ..
Mitglied: bastla
01.07.2011 um 14:21 Uhr
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 Formatierung ...
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:
01.
@echo off & setlocal enabledelayedexpansion 
02.
 
03.
set "inDir=C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\input" 
04.
set "outDir=C:\Hoch\Data\Entwicklung\fest_satzbeschreibung\output" 
05.
set "indexMsk=west_batch_v1_test.txt" 
06.
set "Log=log_feste_satzbeschreibung.txt" 
07.
set "Delim=;" 
08.
 
09.
set "Leer44=                                            " 
10.
set "Leer76=                                                                            " 
11.
set "Leer108=                                                                                                            " 
12.
 
13.
del "%outDir%\%Log%" 2>nul 
14.
for %%F in ("%inDir%\%indexMsk%") do ( 
15.
    set "INDEXliste=%%~F" 
16.
    echo Indexliste gefunden: %%~nxF 
17.
     
18.
    for /f "usebackq tokens=1-2 delims=%Delim%" %%a in ("!INDEXliste!") do ( 
19.
        set "E008=%%a%Leer44%" 
20.
        set "E009=%%b%Leer76%" 
21.
        echo !E008:~0,44!!E009:~0,76! 
22.
23.
)>>"%outDir%\%Log%"
Hinsichtlich der Ausgabe in Zeile 21 musst Du ggf noch nachbessern ...
[/Edit]

Grüße
bastla
Bitte warten ..
Mitglied: LordStickstoff
04.07.2011 um 07:21 Uhr
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!
Bitte warten ..
Mitglied: bastla
04.07.2011 um 08:36 Uhr
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
Bitte warten ..
Neuester Wissensbeitrag
Internet

Unbemerkt - Telekom Netzumschaltung!

(3)

Erfahrungsbericht von ashnod zum Thema Internet ...

Ähnliche Inhalte
Batch & Shell
Ä in batch Datei (12)

Frage von BergEnte zum Thema Batch & Shell ...

Heiß diskutierte Inhalte
Switche und Hubs
Trunk für 2xCisco Switch. Wo liegt der Fehler? (15)

Frage von JayyyH zum Thema Switche und Hubs ...

DSL, VDSL
DSL-Signal bewerten (13)

Frage von SarekHL zum Thema DSL, VDSL ...