gurkenhobel
Goto Top

Arraywert läßt sich nicht in Datei schreiben

Hallo,

ich arbeite mit kommaseparierten Datendateien (CSV). Hin und wider kommt mir mal eine Datei mit über 200 Datensätzen unter, die weniger Datenfelder als üblich (hier 18) enthält. Das letzte Feld ist immer das Datum in der üblichen Schreibeweise (TT.MM.JJJJ). Manchmal fehlt dies auch (es sind also nur 17 Datenfelder) und mein Skript bricht mit dem Typunverträglichkeitsfehler ab.

So möchte ich also die Ausgabe in eine andere Datei in der Art manipulieren, daß bei einer Anzahl der Datenfelder kleiner als 18 (UBound) ein String in die Ausgabedatei geschrieben wird. Leider kommt immer wieder bei dem "kürzeren Datensatz" der obige Fehler. Was kann man tun ? CStr und CDate funktioneren nicht. Hier Teile des Codes:

Set fso = CreateObject("Scripting.FileSystemObject")  

If fso.FileExists(EingabeDatei) Then
Set objEingabe = fso.OpenTextFile(EingabeDatei, 1)
Set objAusgabe = fso.CreateTextFile(Ausgabedatei, 2)
objEingabe.Skipline ' Die erste Zeile weglassen  

Do While not objEingabe.AtEndOfLine
Inhalt=objEingabe.ReadLine ' ReadAll  

arrFeld=Split(Inhalt, ";") ' in Arrays aufsplitten  

 ....

' mit UBound prüfen ob 18 Datenfelder vorhanden  

Zahl=Ubound(arrFeld) ' Die höchste Zahl  
 If Zahl=17 Then 
  Datum=CDate(arrFeld(17)) ' <------------ Typen unverträglich  
 else
  Datum=" Datum fehlt !"  
 end if

MsgBox Datum ' zur Kontrolle !  

accNamen=arrFeld(10) & ";" & arrFeld(15) & ";" & arrFeld(11) & ";" & arrFeld(12) & ";" & Datum & ";1920x1080;D;" & UCase(arrFeld(16)) & ";"  

objAusgabe.WriteLine accNamen

Loop

objEingabe.Close
objAusgabe.Close

Set objAusgabe = Nothing
Set objEingabe = Nothing
Set fso = Nothing

Eine andere Möglichkeit wäre wohl gewesen, über objEingabe.Readline zu prüfen ob das vierte Zeichen von rechts eine 2 ist. Aber das wäre auch gescheitert, denn das vorletzte Datenfeld kann manchmal auch Zahlen enthalten.

Freundliche Grüße

GH

Content-Key: 193090

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

Printed on: April 25, 2024 at 05:04 o'clock

Member: bastla
bastla Oct 21, 2012 at 19:10:32 (UTC)
Goto Top
Hallo Gurkenhobel!

Du könntest vorweg den Feldinhalt auf "Datumswert" prüfen:
If IsDate(arrFeld(17)) Then ...
- schließlich weist die Fehlermeldung darauf hin, dass eben doch nicht immer, wenn es ein 18. Feld im Datensatz gibt, auch ein Datum drin steht ...

Grüße
bastla
Member: Gurkenhobel
Gurkenhobel Oct 22, 2012 updated at 13:00:17 (UTC)
Goto Top
Hallo bastla,

Danke für Deine Hilfe:

Zitat von @bastla:
- schließlich weist die Fehlermeldung darauf hin, dass eben doch nicht immer, wenn es ein 18. Feld im Datensatz gibt, auch ein Datum drin steht ...

die Abfrage von Dir übernimmt keine löscht ungültigen Datumsformate (z.B. 31.11.2011), d.h. das Feld in der neuen Datei blieb frei. Ich habe den Code im Block (Zeile 17 bis 22) etwas abgewandelt. Das ist nun meine endgültige Lösung:

Zahl=Ubound(arrFeld) ' Die höchste Zahl  
 If Zahl=17 Then
  if IsDate (arrFeld(17)) then
   Datum=CDate(arrFeld(17))
  else
   Datum="ungültiges Datum"  
  end if
 else
  Datum="fehlendes Datum"  
 end if

Danke und Tschüs

GH

<edit> 15:00: kleine Korrektur</>
Member: bastla
bastla Oct 22, 2012 updated at 10:26:40 (UTC)
Goto Top
Hallo Gurkenhobel!

Abgesehen davon, dass eine Abfrage nix löscht, war das ohnehin etwa so gemeint, wie Du es jetzt umgesetzt hast ... face-wink

Grüße
bastla
Member: Gurkenhobel
Gurkenhobel Oct 22, 2012 at 13:07:50 (UTC)
Goto Top
Hi bastla,
abschließend habe ich meine Falschaussage noch mal revidiert.
Ich wünsche Dir noch einen schönen Tag ;-]

GH