Seite 1 von 1

Brauche Hilfe beim Sortieren

Verfasst: 02.06.2019 14:27
von bin_neu_hier
Hallo,

ich möchte folgendes tun:

Eine Reihe von Dateien sollen eingelesen werden, in denen die Daten immer wie folgt vorliegen:
Datum
Wert1
Wert2
...
Wert15

Der Datumswert liegt als "Sekundenwert" vor (den man beispielsweise mit

Code: Alles auswählen

Debug Date()
erhalten würde). Die Anzahl der Dateien ist unbekannt, die Werte liegen als Strings vor und können ebenfalls in der Länge variieren.

Ich hatte vor, die Dateien auszulesen und die Inhalte in einen String zu schreiben, jeden Einzelwert durch "|" getrennt, und die Daten jeder Datei durch "§" getrennt, um dann jeden einzelnen Satz mit

Code: Alles auswählen

StringField(gesamtstring$, "§")
und jeden Einzelwert mit

Code: Alles auswählen

StringField(einzelstring$, "|")
auszulesen.

Wie kann ich die Sätze im Gesamtstring nach dem Datumswert sortieren?

Wenn das nur mit einem Array ginge, wie DIMensioniere ich ein Array, wenn ich vorher nicht wissen kann, wieviele Daten zu verarbeiten sind? Wäre das mit (sinngemäß, kein richtiger Code)

Code: Alles auswählen

dim 1
while  (noch mehr Dateien vorhanden)
redim +1
wend
sinnvoll oder gibt es da was Sinnvolleres?

Re: Brauche Hilfe beim Sortieren

Verfasst: 02.06.2019 15:25
von ST4242
Hallo,

an deiner Stelle würde ich eine Structur erstellen

Structure Werte
Datum.i
wert1
wert2
...
endstructure


und von dieser eine LinkedList erstellen

NewList Liste().Werte

Damit kann jede Datei ein Listenelement eingefügt werden, als auch über dir Sortierfunktionen sortiert werden.

Daher bitte mal die Themen Strukturen als auch PureBasic - List in der Hilfe nachschlagen.

Ich hoffe das hilft weiter

Re: Brauche Hilfe beim Sortieren

Verfasst: 02.06.2019 15:27
von Bisonte
Geht es jetzt darum, aus vielen einzelnen Dateien immer nur einen String auszulesen und dies dann zu sortieren ?

Dann nehme eine Liste :

Code: Alles auswählen

NewList String.s()

While (nächste Datei)

  AddElement(String())
  String() = Eingelesener String

Wend

; Sortieren
SortList(String(), #PB_Sort_Ascending)
; Ausgeben
Foreach String()
  Debug String()
Next


Re: Brauche Hilfe beim Sortieren

Verfasst: 02.06.2019 16:18
von NicTheQuick
Ich würde auch eine Struktur und eine Liste nutzen. Wenn pro Datei immer 15 Datenwerte vorhanden sind, dann sollte es sogar mit sowas simplem wie dem hier gehen:

Code: Alles auswählen

Structure File
	filename.s
	timestamp.i
	value.s[15]
EndStructure

NewList files.File()

Procedure addFile(List files.File(), filename.s)
	Protected fileId.i
	
	fileId = ReadFile(#PB_Any, filename)
	If Not fileId
		ProcedureReturn #False
	EndIf
	
	If Not AddElement(files())
		ProcedureReturn #False
	EndIf
	
	files()\filename = filename
	files()\timestamp = Val(ReadString(fileId))
	Protected i.i
	For i = 0 To 14
		files()\value[i] = ReadString(fileId)
	Next
	
	CloseFile(fileId)
EndProcedure

addFile(files(), "/tmp/datei1.txt")
addFile(files(), "/tmp/datei2.txt")
addFile(files(), "/tmp/datei3.txt")
addFile(files(), "/tmp/datei4.txt")
addFile(files(), "/tmp/datei5.txt")

SortStructuredList(files(), #PB_Sort_Ascending, OffsetOf(File\timestamp), #PB_Integer)

Debug "Dateinamen sortiert nach Zeitstempel"
ForEach files()
	Debug files()\filename
Next

Re: Brauche Hilfe beim Sortieren

Verfasst: 02.06.2019 16:56
von mk-soft
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

Uff!

Verfasst: 02.06.2019 21:49
von bin_neu_hier
Hallo Allerseits und besten Dank an alle für eure Beiträge.

Das will jetzt erst mal verdaut werden ...