Wie sehen die Daten aus?
- Erste Zeile Spaltennamen
- Trennzeichen in Datei
- Ist es eine CSV
Solltest mit Strukturen und LinkedList mal anfangen!
Werde mal ein kleines Beispiel schreiben...
Fertig mit Dynamischen Columns
Update
Wenn es nur für Windows ist, kann man die Automation von MS verwenden um ein Datums String in beliebiger form
in ein TimeStamp von type Double zu wandeln.
Code: Alles auswählen
;-TOP
;-Strukturen
Structure udtDataColumns
RecID.i ; Intern
TimeStamp.d ; Intern
Datum.s ;
List Column.s() ; Dynamische Columns nach Feld Datum
EndStructure
;-Functions
Procedure LoadData(FileName.s, Separator.s, List Result.udtDataColumns(), IgnoreFirstLine = #False)
Protected file, bom, line.s, datum.s, col, count, index
Protected vTime.Variant, vTimeStamp.Variant
file = ReadFile(#PB_Any, FileName)
If file = 0
Debug "Fehler - Datei öffnen: " + FileName
ProcedureReturn 0
EndIf
bom = ReadStringFormat(file)
If bom <> #PB_Ascii And bom <> #PB_UTF8 And bom <> #PB_Unicode
Debug "Fehler - BOM wird nicht unterstützt"
CloseFile(file)
ProcedureReturn -1
EndIf
If IgnoreFirstLine
If Not Eof(file)
line = ReadString(file, bom)
EndIf
EndIf
While Not Eof(file)
line = ReadString(file, bom)
col = CountString(line, Separator)
count + 1
If AddElement(Result()) = 0
Debug "Fehler - Out Of Memory"
CloseFile(file)
ProcedureReturn -2
EndIf
Result()\RecID = count
datum = StringField(line, 1, Separator)
; Nutzung der Automation zur Datumsanpassung
vTime\vt = #VT_BSTR
vTime\bstrVal = SysAllocString_(@Datum)
If VariantChangeType_(vTimeStamp, vTime, 0, #VT_DATE) = #S_OK
Result()\TimeStamp = vTimeStamp\date
EndIf
VariantClear_(vTime)
; Ende
Result()\Datum = Datum
For index = 2 To col +1
AddElement(Result()\Column())
Result()\Column() = StringField(line, index, Separator)
Next
Wend
CloseFile(file)
ProcedureReturn ListSize(Result())
EndProcedure
Procedure OutputData(List Result.udtDataColumns())
Protected output.s
output = "RecID" + #TAB$ + "TimeStamp" + #TAB$ +"Datum" + #TAB$ + "Column, ..."
Debug output
ForEach Result()
output = "" + Result()\RecID + #TAB$ + Result()\TimeStamp + #TAB$ + Result()\Datum
ForEach Result()\Column()
output + #TAB$ + Result()\Column()
Next
Debug output
Next
EndProcedure
Procedure CreateData(FileName.s)
Protected file, line.s
file = CreateFile(#PB_Any, FileName)
If file
Restore DummyData
Read.s line
While line <> ""
WriteStringN(file, line, #PB_UTF8)
Read.s Line
Wend
CloseFile(file)
EndIf
EndProcedure
;-Test
Global NewList Rows.udtDataColumns()
CreateData(GetHomeDirectory() + "Dummy.dat")
ClearList(Rows())
count = LoadData(GetHomeDirectory() + "Dummy.dat", ",", Rows())
Debug "Count Of Rows = " + count
SortStructuredList(Rows(), #PB_Sort_Ascending, OffsetOf(udtDataColumns\TimeStamp), #PB_Double)
OutputData(Rows())
End
DataSection
DummyData:
Data.s "23.05.2017 18:00,2,3,4,5"
Data.s "2019.06.020,100,200,300,400,500,600,700"
Data.s "2018-01-01,A,C,D"
Data.s "15.6.2015 12:00,A1,C2,D3"
Data.s ""
EndDataSection