stoner
Goto Top

Textdatei mit leeren Feldern umwandeln

Hallo zusammen,

ich möchte eine Textdatei (Gebührendatensätze aus einer TK Anlage) per batch umwandeln damit ich sie in eine Firebird Datenbank einlesen kann. Mit Hilfe dieses Forums habe ich schon einiges gelöst, leider komme ich nun nicht mehr weiter:

Die ursprüngliche Datei hat als Trennzeichen Semikolon, mein Problem ist nun, daß einige Felder (je nach Art der Verbindung) manchmal gefüllt sind und manchmal nicht:

10.08.06;08:40:09;1;11;;00:01:14;0943211234;;2;;;0;1;
10.08.06;08:45:36;1;11;00:06;00:02:48;;;1;;;;;
usw.

mit:

FOR /F "tokens=1-13 delims=;" %%a IN (%1) DO echo '%%a','%%b',%%c,%%d,%%e,%%f,%%g,%%h,%%i,%%j,%%k,%%l,%%m >> temp.txt

werden nun die leeren Felder übersprungen, und je nach Verbindungsart verschiebt sich das Ganze.
Weis hier jemand eine Lösungsmöglichkeit?

Besten Dank schon mal,


Frank

Content-Key: 37984

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

Printed on: April 26, 2024 at 22:04 o'clock

Member: miniversum
miniversum Aug 14, 2006 at 19:13:28 (UTC)
Goto Top
Ich verstehs nicht ganz tut mir leid. Was soll den als Ergebnis rauskommen bzw. in der Datei stehen?
miniversum
Member: stoner
stoner Aug 14, 2006 at 19:20:45 (UTC)
Goto Top
Hi miniversum,

voerst sollen die Daten nur in das richtige Format, Trennzeichen Komma und einige Felder mit Hochkomma eingegrenzt.
Am Ende sollen dann die Daten per Batch komplett in die Datenbank eingelesen werden.

Frank
Member: miniversum
miniversum Aug 14, 2006 at 19:34:42 (UTC)
Goto Top
Na das Funktioniert doch?
Also bei mir kommt nach deiner Forschleife folgendes raus:

'10.08.06','08:40:09',1,11,00:01:14,0943211234,2,0,1,,,,
'10.08.06','08:45:36',1,11,00:06,00:02:48,1,,,,,,

Soll das Ergebnis den anders aussehen?
Wenn ja mach mal ein Beispiel.

miniversum
Member: stoner
stoner Aug 14, 2006 at 19:51:14 (UTC)
Goto Top
genau hier ist das Problem, es gehen alle leeren Felder verloren, und somit kann ich keine Zuordnung zu den felder der Firebird db mehr machen.
Ich bräuchte in jeder Zeile immer alle Felder (kommagetrennt) damit ich eine feste Zuordnung machen kann.

'10.08.06','08:40:09',1,11,,'00:01:14',0943211234,,2,,,0,1,
'10.08.06','08:45:36',1,11,'00:06','00:02:48',,,1,,,,,

Edit: anscheinend wird das Format ein bischen durcheinandergewürfelt

Frank
Member: Biber
Biber Aug 14, 2006 at 21:15:00 (UTC)
Goto Top
Moin stoner,

auch dafür gibt es eine Strategie...

wenn Deine Zeile so aussieht:
10.08.06;08:45:36;1;11;00:06;00:02:48;;;1;;;;;

und Du diese Zeile in eine Variable packst:
set zeile=10.08.06;08:45:36;1;11;00:06;00:02:48;;;1;;;;;
...dann ersetze alle aufeinanderfolgenden Trennzeichen (z.B.";") durch Trennzeichen-Dummy-Trennzeichen.
Wobei "Dummy" ein Zeichen ist, dass NIE (oder eigentlich nie *gg) in einer Zeile vorkommt, z.B. ein "@".

Auf bätschisch also
..
set zeile=10.08.06;08:45:36;1;11;00:06;00:02:48;;;1;;;;;
set zeile=%zeile:;;=;@;%
REM %zeile% ist jetzt "10.08.06;08:45:36;1;11;00:06;00:02:48;@;;1;@;;@;;" , da nicht alle ";;" ersetzt wurden.  
REM Warum, das leuchtet beim kurzen Nachdenken aber ein...
REM ...also machen wir das dreimal:
set zeile=%zeile:;;=;@;%
set zeile=%zeile:;;=;@;%
...

Und jetzt das Ganze in Deinem Batch:
.. -------- ungetesteSkizze.bat
REM ..hier bedeutet Parameter 1 (%1) noch: NameDerInputdatei.xyz
...
FOR /F "delims=" %%a IN (%1) DO call :NormalizeIt %%a  
goto :eof

:normalizeIt [parameter 1 ist die ´komplette Zeile]
set zeile=%1 
set zeile=%zeile:;;=;@;%
REM ...machen wir das dreimal:
set zeile=%zeile:;;=;@;%
set zeile=%zeile:;;=;@;%
FOR /F "tokens=1-13 delims=;" %%a IN (%1) DO echo '%%a','%%b',%%c,%%d,%%e,%%f,%%g,%%h,%%i,%%j,%%k,%%l,%%m >> temp.txt  
goto :eof

Hope That Helps
Biber
Member: stoner
stoner Aug 15, 2006 at 00:27:14 (UTC)
Goto Top
Hallo Biber,

erstmal besten Dank für die Antwort, aber irgentwie komm ich nicht ganz klar damit:

@echo off
FOR /F "delims=" %%a IN (%1) DO goto normalize %%a
goto :eof

:normalize
set zeile=%1
set zeile=%zeile:;;=;0;%
set zeile=%zeile:;;=;0;%
set zeile=%zeile:;;=;0;%
FOR /F "tokens=1-13 delims=;" %%a IN (%1) DO echo '%%a','%%b','%%c','%%d','%%e','%%f','%%g','%%h','%%i','%%j','%%k','%%l','%%m' >> gezout.txt
goto :eof

ergibt das gleiche wie ohne normalize. Ich habe das ganze von hinten bis vorne durchgespielt, aber irgentwo ha ich nen hänger, es ergibt alles immer das gleiche:

'13.08.06','18:31:00','1','11','00:18','00:00:00','099221123410','2','0','1','','',''
'14.08.06','09:28:52','1','11','00:07','00:00:00','099211239410#','2','0','1','','',''
'14.08.06','10:19:15','1','11','00:07','00:03:02','1','','','','','',''

Es sollten alle Felder in Hochkomma stehen, und leere Felder sollten mit '0' gefüllt werden.
Besten Dank schon mal für eure Hilfe,

n8 Frank
Member: Biber
Biber Aug 15, 2006 at 17:48:21 (UTC)
Goto Top
Moin stoner,

dann versuchs hiermit:
[Inputdate heißt bei mir Stoner.In; Outputdatei stoner.Out]
::---------stoner.bat parameter1=Inputdatei
@echo off & setlocal
del stoner.out >nul
%JustADebugLine% echo Input %: & type %1
FOR /F "delims=" %%a IN (%1) DO call :normalize %%a  
%JustADebugLine% echo Output : & type stoner.Out 
goto :eof
:normalize
set "zeile=%*"  
set zeile=%zeile:;;=;0;%
set zeile=%zeile:;;=;0;%
set zeile=%zeile:;;=;0;%
FOR /F "tokens=1-13 delims=;" %%a IN ("%zeile%") DO (   
 echo '%%a','%%b','%%c','%%d','%%e','%%f','%%g','%%h','%%i','%%j','%%k','%%l','%%m'>>stoner.Out  
 )
goto :eof
Demo am CMD-Prompt:
$cmd$stoner stoner.In
Input stoner.In:
10.08.06;08:40:09;1;11;;00:01:14;0943211234;;2;;;0;1;
10.08.06;08:45:36;1;11;00:06;00:02:48;;;1;;;;;
Output:
'10.08.06','08:40:09','1','11','0','00:01:14','0943211234','0','2','0','0','0','1'  
'10.08.06','08:45:36','1','11','00:06','00:02:48','0','0','1','0','0','0','0'  

Gruß
Biber
Member: stoner
stoner Aug 18, 2006 at 18:07:22 (UTC)
Goto Top
Hi Biber,

sorry, hatte die letzten Tage Stress aber - es klappt!
Besten Dank, 100% das was ich brauche, Thx.


Ciao, Frank
Member: Biber
Biber Aug 18, 2006 at 18:12:37 (UTC)
Goto Top
Moin stoner,

dann setz ich den Beitrag auf "Gelöst" und mache ihn dicht.
Rechtzeitig vor dem Wochenende.

Ciao dito
Frank