Ich schreibe derzeit ein Programm um eine CSV Datei zu parsen.
Solche CSV Dateien können gut und gerne über 30 Megabyte gehen.
Derzeit mache ich es so, dass ich folgenden Codeschnipsel nutze um diese Auszulesen, nach zu bearbeiten und dann in eine Datei schreiben
Code: Alles auswählen
If ReadFile(1, Dateien()\File)
CreateFile(2, Dateien()\TMPFile)
Dateien()\UploadTemp = 1
AddElement(TempFiles())
TempFiles()\File = Dateien()\File+"_neu.csv"
FileLength.q = Lof(1)
While(Eof(1) = 0)
FilePosition.q = Loc(1)
SetGadgetText(#Text_2, "Fahrzeug"+#CRLF$+Str(FilePosition)+"/"+Str(FileLength))
SetGadgetState(#ProgressBar_0, FilePosition * 100 / FileLength)
FILE$ = ReadString(1)
F01.s = ""
F02.s = ""
F03.s = ""
F04.s = ""
F05.s = ""
F06.s = ""
F07.s = ""
F08.s = ""
F09.s = ""
F10.s = ""
F11.s = ""
F12.s = ""
F13.s = ""
Zeile.s = ""
Zeile = FILE$
F01.s = StringField(Zeile, 1, ";"); : Debug F01
F02.s = StringField(Zeile, 2, ";"); : Debug F02
F03.s = StringField(Zeile, 3, ";"); : Debug F03
F04.s = StringField(Zeile, 4, ";"); : Debug F04
F05.s = StringField(Zeile, 5, ";"); : Debug F05
F06.s = StringField(Zeile, 6, ";"); : Debug F06
F07.s = StringField(Zeile, 7, ";"); : Debug F07
F08.s = StringField(Zeile, 8, ";"); : Debug F08
F09.s = StringField(Zeile, 9, ";"); : Debug F09
F10.s = StringField(Zeile, 10, ";"); : Debug F10
F11.s = StringField(Zeile, 11, ";"); : Debug F11
F12.s = StringField(Zeile, 12, ";"); : Debug F12
F13.s = StringField(Zeile, 13, ";"); : Debug F13
;Hier sind dann noch Nahcbearbeitungen wie z.B. Quotes entfernen und div. Sonderzeichen
If F01 <> Chr(34)+"F01"+Chr(34)
NEWFILE$ = NEWFILE$ + F01 + ";" + F02 + ";" + F03 + ";" + F04 + ";" + F05 + ";" + F06 + ";" + F07 + ";" + F08 + ";" + F09 + ";" + F10 + ";" + F11 + ";" + F12 + ";" + F13 + #CRLF$
EndIf
Wend
WriteStringN(2, NEWFILE$)
CloseFile(2)
CloseFile(1)
SetGadgetState(#ProgressBar_1,GetGadgetState(#ProgressBar_1)+1)
EndIf
Wäre nett wenn mir jemand Tipps geben könnte, wie ich das optimieren kann so dass das Verarbeiten einer 3mB Datei nicht 2 Minuten und mehr dauert...
EDIT:
Hab mittlerweilen schon doppelte Geschwindigkeit erzielt indem ich das GadgetUpdate so hier mache:
Code: Alles auswählen
If ReadFile(1, Dateien()\File)
CreateFile(2, Dateien()\TMPFile)
Dateien()\UploadTemp = 1
AddElement(TempFiles())
TempFiles()\File = Dateien()\File+"_neu.csv"
FileLength.q = Lof(1)
FilePosition.q = 0
OldProzent = 0
While(Eof(1) = 0)
FilePosition = Loc(1)
CurrProzent = FilePosition * 100 / FileLength
If(OldProzent <> CurrProzent)
SetGadgetText(#Text_2, "Fahrzeug"+#CRLF$+Str(FilePosition)+"/"+Str(FileLength))
SetGadgetState(#ProgressBar_0, FilePosition * 100 / FileLength)
OldProzent = CurrProzent
EndIf
FILE$ = ReadString(1)
F01.s = ""
F02.s = ""
F03.s = ""
F04.s = ""
F05.s = ""
F06.s = ""
F07.s = ""
F08.s = ""
F09.s = ""
F10.s = ""
F11.s = ""
F12.s = ""
F13.s = ""
Zeile.s = ""
Zeile = FILE$
F01.s = StringField(Zeile, 1, ";"); : Debug F01
F02.s = StringField(Zeile, 2, ";"); : Debug F02
F03.s = StringField(Zeile, 3, ";"); : Debug F03
F04.s = StringField(Zeile, 4, ";"); : Debug F04
F05.s = StringField(Zeile, 5, ";"); : Debug F05
F06.s = StringField(Zeile, 6, ";"); : Debug F06
F07.s = StringField(Zeile, 7, ";"); : Debug F07
F08.s = StringField(Zeile, 8, ";"); : Debug F08
F09.s = StringField(Zeile, 9, ";"); : Debug F09
F10.s = StringField(Zeile, 10, ";"); : Debug F10
F11.s = StringField(Zeile, 11, ";"); : Debug F11
F12.s = StringField(Zeile, 12, ";"); : Debug F12
F13.s = StringField(Zeile, 13, ";"); : Debug F13
;Hier sind dann noch Nahcbearbeitungen wie z.B. Quotes entfernen und div. Sonderzeichen
If F01 <> Chr(34)+"F01"+Chr(34)
NEWFILE$ = NEWFILE$ + F01 + ";" + F02 + ";" + F03 + ";" + F04 + ";" + F05 + ";" + F06 + ";" + F07 + ";" + F08 + ";" + F09 + ";" + F10 + ";" + F11 + ";" + F12 + ";" + F13 + #CRLF$
EndIf
Wend
WriteStringN(2, NEWFILE$)
CloseFile(2)
CloseFile(1)
SetGadgetState(#ProgressBar_1,GetGadgetState(#ProgressBar_1)+1)
EndIf