Seite 1 von 1

SortStructuredList() mit Arrays in der Struktur

Verfasst: 31.05.2014 12:05
von mave
Hallo,

evt. ist es der falsche Ansatz, dennoch: mit SortStructuredList() lassen sich ja Listen mit Strukturen schön sortieren, sofern die Struktur fix ist. Was ist aber hier:

Code: Alles auswählen

Structure CSVData
  blabla.s
  datensdatz.s[1000]
EndStructure

NewList.CSVData Records()

; Records() wird gefüllt, wobei auch vorkommt

Records()\datensatz[x] = "Irgendwas"
; ...

; funktioniert prima:
SortStructuredList(Records(), #PB_Sort_Descending, OffsetOf(CSVData\blabla), #PB_String)
ABER eine Ausrichtung nach dem Offset von Records()\datensatz[x] funktioniert nicht:
Offset.i = OffsetOf(CSVData\datensatz) + (x * 4)
SortStructuredList(Records(), #PB_Sort_Descending, Offset, #PB_String)
Gedanke: einlesen einer CSV-Datei, dabei die einzelnen Felder separieren (==> Records()\datensatz[x] ), um die Daten(zeilen) dann nach Spalten sortieren zu können.
Das geht natürlich, sofern die Struktur der CSV-Datei bekannt ist mit fixer Strukturvorgabe. Wenn's aber flexibel sein soll...?
Oder sitze ich einem Denkfehler auf, bzw. leistet das SortStructuredList() intern schlicht nicht, sich an der angegeben (relativen) Offsett-Adresse auf die Zeiger der Stringgdaten zu orientieren?

Re: SortStructuredList() mit Arrays in der Struktur

Verfasst: 01.06.2014 19:55
von mave
... irgendwas hatte ich beim Testen übersehen. Mittlerweile läuft das, z.B. so:

Code: Alles auswählen

Procedure.i GetOffset(Feld.i)
  ProcedureReturn Feld * 4
EndProcedure

#MAX=3000

Structure CSVRecord
  csvdata.s[#MAX]
EndStructure

#CSVTrenner = ","   ; oder 'was anderes

Define.i Spalten, Count, Offset
NewList CSVDaten.CSVRecord()

CSVFile = "xxx.csv"
hCSV = ReadFile(#PB_Any, CSVFile)
Spalten  = 20   ; vorher zu ermitteln...


; Einlesen der CSV:
ClearList(.CSVRecord())
While Eof(hCSV)=0
  Buffer = ReadString(hCSV)   ; CSV-Zeile lesen
  AddElement(.CSVRecord())  ; Listenelement hinzufügen
  For Count = 1 To Spalten     ; Spalten-/Feldinhalte extrahieren und in die Struktur einfügen
    CSVRecord()\csvdata[Count] = StringField(Buffer, Count, #CSVTrenner)
  Next Count
Wend
CloseFile(hCSV)

Offset = GetOffset(5)  ; z.B. nach Spalte/Feld Nr.5 sortieren
SortStructuredList(CSVRecord(), #PB_Sort_Descending | #PB_Sort_NoCase , Offset, #PB_String)

; Debug ....
Funktioniert!

Re: SortStructuredList() mit Arrays in der Struktur

Verfasst: 01.06.2014 21:23
von NicTheQuick
mave hat geschrieben:Funktioniert!
Ist aber falsch. Bei 64-Bit-System stimmt das nämlich nicht mehr.
Nutze lieber das hier:

Code: Alles auswählen

#MAX=3000

Structure CSVRecord
  csvdata.s[#MAX]
EndStructure

Procedure.i GetOffset(Feld.i)
  ProcedureReturn OffsetOf(CSVRecord\csvdata) + SizeOf(String) * Feld
EndProcedure

Debug GetOffset(4)
Leider kann man anscheinend nicht so was schönes schreiben wie 'SizeOf(CSVRecord\csvdata[0])'.