tearsofsun
Goto Top

Batch Leerzeichen-Tabs an Zeilenenden entfernen

Hallo guten Tag,

folgende Situation. Wir müssen mehrfach am Tag bei uns Daten von einem FTP Server holen und zum verarbeiten zusammen kopieren, dies habe ich sehr gut gelöst mit (If Exist usw.).

Jetzt kommt es aber teilweise vor das manche Zeilen endlos Leerzeichen noch am Ende haben die vom eigentlichem Verarbeitungsprogramm dann nicht verarbeitet werden können.

Beispiel:

Q0010024P18950 14840 18950

Hinter 18950 befinden sich noch 10Leerzeichen, kann man mit einem Batchjob diese Leerzeichen am Ende entfernen?

Habe so noch nichts produktives dazu gefunden. Wichtig es muss ein Batchjob sein kein VBScript.

Ein zugehen auf den Absender der Fehlerhaften Daten erfolglos, ein zugehen auf den DL des Verarbeitungsprogramms erfolglos, da dies zu fehlern innerhalb der Verarbeitung der Enddaten führt.

Grüße

Content-Key: 563411

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

Ausgedruckt am: 19.03.2024 um 07:03 Uhr

Mitglied: TK1987
Lösung TK1987 06.04.2020, aktualisiert am 07.04.2020 um 12:29:00 Uhr
Goto Top
Moin,

Zitat von @Tearsofsun:
Habe so noch nichts produktives dazu gefunden. Wichtig es muss ein Batchjob sein kein VBScript.
also auch kein Powershell? Damit wäre es ein Einzeiler.

Mit Batch musst du hallt einen Loop bauen, etwa so:
set file=Q0010024P18950 14840 18950          
goto :Check

:Loop
set File=%File:~0,-1%
:Check
if "%File:~-1%" equ " " goto :Loop  
Das kann bei sehr vielen Dateien allerdings unter Umständen eine Hohe Laufzeit haben. Eine weitere Möglichkeit, falls die Dateinamen immer aus drei Teilen bestehen, wäre sie mit einer For-Schleife zu splitten
@echo off
set Pfad=C:\Test
for %%A in ("%Pfad%\*") do (  
	for /f "Tokens=1-3" %%B in ("%%~nA") do Ren "%%A" "%%B %%C %%D%%~xA"  
	)

Gruß Thomas
Mitglied: Tearsofsun
Tearsofsun 06.04.2020 um 10:53:10 Uhr
Goto Top
Hallo Tomas,

das erste funktioniert nicht, eventuell weil Dir eventuell eine Information fehlt oder ich falsch beschrieben habe ; )

Nach dem zusammenkopieren von Dateien zu einer grossen sieht diese so aus als Beispielauszug, hinter manchen Zeilen ist das beschriebene Problem der noch zusätzlichen unnötigen Leerzeichen die ich weghaben muss ; ), ganz unten habe ich Dir mal meinen Batchjob beigefügt damit Du nachvollziehen kannst was passiert. Interessant wäre wenn es Möglich ist am Ende der Batch die funktion der überflüssigen Leerzeichen auf die geschriebenen Dateien auszuführen.

@@PHSTAT512 0512003500107 SCHROED LOHMOE1
Q0010024P14840 13240 13240
Q104840002141098005 4030548 012060420200956 0000Bechstedt 52.324445,8.611752 200406100009
Q204840002141098005 30700342600907452201205 06042020095608001Bechstedt
Q30SCUXML
Q204840002141098005 30700342600907452201212 06042020095609001Bechstedt
Q30SCUXML
Q204840002141098005 30700342600907452201229 06042020095610001Bechstedt
Q30SCUXML
Q104840002141098005 4030548 056060420200951 0000 52.324445,8.611752 200406100009
Z0000000906042020100009
@@PHSTAT512 0512 35 1 7 GITHURM LOHMOE1
Q0010024P14840 15640 15640
Q104840002141079004 5643408585771003 013060420200952
Z0000000206042020100039
@@PHSTAT512 0512 35 1 7 24PL900 LOHMOE1
Q0010024P14840 19000 19000
Q104840002139741005 4840002139741 054060420200935
Z0000000206042020100400
@@PHSTAT512 0512003500107 HEINR00 LOHMOE1
Q0010024P14840 12050 12050
Q104840002139450006 15711331 39906042020094815711331 0000 000000000000
Q204840002139450006 30600342600907407703440 06042020094811010
Q30SCU0001
Q104840002139450006 15711331 39906042020094815711331 0000 00342600907407703440 000000000000
Z0000000506042020100015
@@PHSTAT512 0512003500107 GTSCHEM LOHMOE1
Q0010024P14840 10920 10920
Q104840002140617009 15620517 05606042020095515620517 0000 Ankunft am Zustellort,50.68923,12.56096 000000000000
Q104840002140617009 15620517 01206042020095615620517 0000HERR JENDROSCH 50.68923,12.56103 000000000000
Q204840002140617009 30700342600907452192480 06042020095535901
Z0000000406042020100004
@@PHSTAT512 0512003500107 KLEINE1 LOHMOE1
Q0010024P14840 14060 14060
Q104840002139149009 4840009482214 P15060420200949 00008.4. 08042020 GRVE04013727
Q104840002140027006 4840002397895 012060420200931 0000HERR GOTTEALD 51.2114,6.77382 GRVE04010927
Q104840002140027006 4840002397895 056060420200925 0000 ANKUNFT AM ZUSTELLORT,51.2114 GRVE04010927
Q204840002140027006 30700342600907452183693 06042020092600001
Q30SCUFE391RG2
Q104840002140588002 4840002398420 012060420200931 0000HERR GOTTEALD 51.2114,6.77382 GRVE04012686
Q104840002140588002 4840002398420 056060420200925 0000 ANKUNFT AM ZUSTELLORT,51.2114 GRVE04012686
Q204840002140588002 30700342600907452190929 06042020092500001
Q30SCUFE391RG2


Batchjob Abholen, trennen zusammenkopieren:

@echo on
color 9F
rem --------------------------------------------------------------
rem -----Dies ist die Stapelverarbeitung für folgende Prozesse----
rem -----Daten für die Bereiche Entladeberichte, Statusdaten ----
rem -----Abholaufträge, Eingangsborderos in einem einzigem ----
rem -----Arbeitsschritt verarbeitet werden. ----
rem --------------------------------------------------------------
rem ------------- Christian Peters -----------------
rem --------------------------------------------------------------
REM ____Zeitstempel setzen________
set test=%time:~0,2%%time:~3,2%
IF %test% LSS 1000 set vdat=%date:~6,4%%date:~3,2%%date:~0,2%0%time:~1,1%%time:~3,2%
IF %test% GEQ 1000 set vdat=%date:~6,4%%date:~3,2%%date:~0,2%%time:~0,2%%time:~3,2%

ftp -i -s:R:\Lohmoeller\DFU\24P-Eingehend.ftp XXX.XX.XX.XXX >> R:\Lohmoeller\FTP\24Plus\SE_24Plus_Batch.log

if exist R:\Lohmoeller\DFU\24P_SE.dat goto APP
if not exist R:\Lohmoeller\DFU\24P_SE.dat goto NEU

:APP
echo Bestehende SE Datei wird erweitert...
copy /b R:\Lohmoeller\DFU\24P_SE.dat + R:\Lohmoeller\FTP\24Plus\*bord*.* R:\Lohmoeller\DFU\24P_SE.dat
if not errorlevel==1 goto APP_OK
if errorlevel==1 goto NOTOK
goto ende

:NEU
echo Neue SE Datei wird geschrieben
copy /b R:\Lohmoeller\FTP\24Plus\*bord*.* R:\Lohmoeller\DFU\24P_SE.dat
if not errorlevel==1 goto NEU_OK
if errorlevel==1 goto NOTOK
goto ende

:APP_OK
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Borderodaten erweitert und archiviert >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo -------------------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende

:NEU_OK
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Borderodaten erstellt und archiviert >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo ------------------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende

:NOTOK
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Borderoberichtsdaten nicht vorhanden >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo ----------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende

:ende

copy /b R:\Lohmoeller\FTP\24Plus\*bord*.* R:\Lohmoeller\FTP\24Plus\SE\Sichern\Bord512-%Vdat%.dat
del R:\Lohmoeller\FTP\24Plus\*bord*.*

if exist R:\Lohmoeller\DFU\24P_STA.dat goto APP1
if not exist R:\Lohmoeller\DFU\24P_STA.dat goto NEU1

:APP1
echo Bestehende Statusdatei wird erweitert...
copy /b R:\Lohmoeller\DFU\24P_STA.dat + R:\Lohmoeller\FTP\24Plus\*stat*.* R:\Lohmoeller\DFU\24P_STA.dat
if not errorlevel==1 goto APP_OK1
if errorlevel==1 goto NOTOK1
goto ende1

:NEU1
echo Neue Statusdatei wird geschrieben...
copy /b R:\Lohmoeller\FTP\24Plus\*stat*.* R:\Lohmoeller\DFU\24P_STA.dat
if not errorlevel==1 goto NEU_OK1
if errorlevel==1 goto NOTOK1
goto ende1

:APP_OK1
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Statusdaten erweitert und archiviert >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo -------------------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende1

:NEU_OK1
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Statusdaten erstellt und archiviert >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo ------------------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende1

:NOTOK1
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Statusdaten nicht vorhanden >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo ------------------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende1

:ende1

copy /b R:\Lohmoeller\FTP\24Plus\*stat*.* R:\Lohmoeller\FTP\24Plus\SE\Sichern\STAT512-%Vdat%.dat
del R:\Lohmoeller\FTP\24Plus\*stat*.*

if exist R:\Lohmoeller\DFU\24P_ENT.dat goto APP2
if not exist R:\Lohmoeller\DFU\24P_ENT.dat goto NEU2

:APP2
echo Bestehende Entladeberichte werden erweitert....
copy /b R:\Lohmoeller\DFU\24P_ENT.dat + R:\Lohmoeller\FTP\24Plus\*entl*.* R:\Lohmoeller\DFU\24P_ENT.dat
if not errorlevel==1 goto APP_OK2
if errorlevel==1 goto NOTOK2
goto ende2

:NEU2
echo Neue Entladeberichte werden geschrieben
copy /b R:\Lohmoeller\FTP\24Plus\*entl*.* R:\Lohmoeller\DFU\24P_ENT.dat
if not errorlevel==1 goto NEU_OK2
if errorlevel==1 goto NOTOK2
goto ende2

:APP_OK2
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Entladeberichte erweitert und archiviert >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo -------------------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende2

:NEU_OK2
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Entladeberichte erstellt und archiviert >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo ------------------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende2

:NOTOK2
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Entladeberichte nicht vorhanden >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo ------------------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende2

:ende2

copy /b R:\Lohmoeller\FTP\24Plus\*entl*.* R:\Lohmoeller\FTP\24Plus\SE\Sichern\ENT512-%Vdat%.dat
del R:\Lohmoeller\FTP\24Plus\*entl*.*

ftp -i -s:R:\Lohmoeller\DFU\24P_ABH.ftp ftptn.eurolog.com >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log

if exist R:\Lohmoeller\DFU\24P_ABH.DAT goto APP3
if not exist R:\Lohmoeller\DFU\24P_ABH.DAT goto NEU3

:APP3
echo Bestehende Abholer Datei wird erweitert...
copy /b R:\Lohmoeller\DFU\24P_ABH.DAT + R:\Lohmoeller\FTP\24Plus\all_status_new.dat R:\Lohmoeller\DFU\24P_ABH.DAT
if not errorlevel==1 goto APP_OK3
if errorlevel==1 goto NOTOK3
goto ende3

:NEU3
echo Neue Abholer Datei wird geschrieben
copy /b R:\Lohmoeller\FTP\24Plus\all_status_new.dat R:\Lohmoeller\DFU\24P_ABH.dat
if not errorlevel==1 goto NEU_OK3
if errorlevel==1 goto NOTOK3
goto ende3

:APP_OK3
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Abholaufträge erweitert und archiviert >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo -------------------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende3

:NEU_OK3
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Abholaufträge erstellt und archiviert >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo ------------------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende3

:NOTOK3
echo %vdat% >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo 24Plus Abholaufträge nicht vorhanden >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
echo ------------------------------------------- >> R:\Lohmoeller\FTP\24Plus\SE\SE_24Plus_Batch.log
goto ende3

:ende3

copy /b R:\Lohmoeller\FTP\24Plus\all_status_new.dat R:\Lohmoeller\FTP\24Plus\Abh\sichern\ABH512-%Vdat%.dat
del R:\Lohmoeller\FTP\24Plus\all_status_new.dat
Mitglied: TK1987
Lösung TK1987 06.04.2020 um 13:00:21 Uhr
Goto Top
Bitte immer Code-Tags für das posten von Code verwenden.

Zitat von @Tearsofsun:
das erste funktioniert nicht, eventuell weil Dir eventuell eine Information fehlt oder ich falsch beschrieben habe ; )
Sicher funktioniert das. Das Zeilenweise einlesen musst du natürlich über eine For-Schleife regeln.
Interessant wäre wenn es Möglich ist am Ende der Batch die funktion der überflüssigen Leerzeichen auf die geschriebenen Dateien auszuführen.
Kein Problem. Den Loop einfach ans Ende des Skript setzen und aus der For-Schleife heraus callen.
for /f "Usebackq Delims=" %%A in ("R:\Pfad\zur\Inputdatei.dat") do (  
	set Zeile=%%A
	call :Check
	)

:: Nachfolgenden Bereich ans Ende des Skripts packen
goto :EoF
:Loop
set Zeile=%Zeile:~0,-1%
:Check
if "%Zeile:~-1%" equ " " (goto :Loop) else (>>"R:\Pfad\zur\Outputdatei.dat" echo %Zeile%)  
"R:\Pfad\zur\Inputdatei.dat" und "R:\Pfad\zur\Outputdatei.dat" müssen natürlich angepasst werden.

Gruß Thomas
Mitglied: Tearsofsun
Tearsofsun 06.04.2020 um 13:36:20 Uhr
Goto Top
Hallo Thomas,

ich habe jetzt bevor ich es in die Batch einfüge in eine seperate Batch geschrieben zum testen, die Pause befehle sind zum schauen was im CMD passiert.
Soweit sehe ich viele Calls, in der Flatfile aber noch keine veränderung der Zeilenenden, irgendwas vergesse ich noch.

for /f "Usebackq Delims=" %%A in ("R:\Lohmoeller\DFU\STAT") do (set Zeile=%%A call :Check)  

pause

:Loop
set Zeile=%Zeile:~0,-1%
:Check
if "%Zeile:~-1%" equ " " (goto :Loop) else (>>"R:\Lohmoeller\DFU\STAT" echo %Zeile%)  
pause
cmd
Mitglied: TK1987
Lösung TK1987 06.04.2020 um 13:47:14 Uhr
Goto Top
Zitat von @Tearsofsun:
for /f "Usebackq Delims=" %%A in ("R:\Lohmoeller\DFU\STAT") do (set Zeile=%%A call :Check)  
Die For-Schleife ist so auch nicht richtig! So wird das call :Check als Zeichenkette mit in die Variable geschrieben.

Entweder, wie ich oben gepostet habe mit Zeilenumbrüchen, oder wenn schon in einer Zeile, dann mit && dazwischen.
for /f "Usebackq Delims=" %%A in ("R:\Lohmoeller\DFU\STAT") do (set Zeile=%%A&&call :Check)  
Mitglied: Tearsofsun
Tearsofsun 06.04.2020 um 14:57:47 Uhr
Goto Top
Hallo Thomas,

OMG bin ich dumm, ja es funktioniert, und ich muss eine neue Datei erzeugen, weil der CMD es sonst in die gleiche Datei unten drunter schreibt.
Man siehts es jetzt auch an der Input Datei=4KB Output =3KB
Vom Prozess selber her ist die Verarbeitung sehr schnell da die Dateien meistens nach dem zusammenkopieren nicht grösser sind als 100-200kb.

Jetz überlege ich gerade wie ich das am besten in die bestehende Batch einbaue. 4 verschieden Dateien erzeuge, oder erweitere ich wenn vorhanden.

Ich denke ich kann am besten am Ende des Hauptbatchjobs einen Datei Call machen auf die 4 geschriebenen Dateien.