Sortierprogramm fast fertig. Noch ein Fehler...
Verfasst: 15.02.2011 19:31
Das Sortierprogramm ist fast fertig nur gibt es noch einen Fehler. NoCase wird nicht beachtet.
Hier mal der ganze Code:
Es geht um SortArray(). Die Funktion hat die Möglichkeit per Parameter NoCase zu sortieren. Macht sie aber nicht. Ich habe in dem Array alle Zeilen aus einer Datei gespeichert. Unter anderem die Werte "a" und "A" und "sdf" und "SDF". Normalerweise sollten nur noch je ein Element vorhanden sein danach.
Auch wenn ich die Variable Flags rausnehme und nur die Konstante für NoCase einsetze funktioniert es nicht. Wie kommt das?
Ich dachte man könnte die Geschwindigkeit noch erhöhen indem man zB redim immer nur alle 1000 Zeilen für weitere 1000 Arraybestandteile macht und am Ende die überschüssigen mit redim abschneidet. Allerdings ist es selbst beim Sortieren von 213.142 Zeilen in unter einer Sekunde fertig. Aber schneller ist immer gut...
Dann habe ich mich gefragt ob man StringGadgets nach erstellen noch schreibgeschützt stellen kann. Dazu habe ich in der Hilfe nichts gefunden.
Und ich frage mich ob ich nicht auf ascii, utf8 usw Wert legen sollte. Bzw ReadStringFormat und sein BOM. Müsste man ja eigentlich um korrekt zu sortieren oder?
Und ansonsten? Gibts Verbesserungsvorschläge?
Hier mal der ganze Code:
Code: Alles auswählen
Procedure Msg(Msg$,Type.l = 0) ;If Type isnt set the Message is a Errormessage
If Type = 0 : Type$ = "Error" : Else : Type$ = "Message" : EndIf
MessageRequester(Type$, Type$+": " + Msg$, 0)
If Type = 0 : End : EndIf
EndProcedure
Procedure ChkCreated(Handle,Type$)
If Handle = 0 : Msg("Couldnt create " + Type$) : EndIf
EndProcedure
MainWindowHandle=OpenWindow(#PB_Any, 0, 0, 600, 140, "SortIt", #PB_Window_SystemMenu | #PB_Window_MinimizeGadget | #PB_Window_MaximizeGadget | #PB_Window_ScreenCentered)
ChkCreated(MainWindowHandle,"Window")
SourceButtonHandle = ButtonGadget(#PB_Any, 10, 10, 110, 25, "Choose Sourcefile")
ChkCreated(SourceButtonHandle,"Button")
TargetButtonHandle = ButtonGadget(#PB_Any, 10, 45, 110, 25, "Choose Targetfile")
ChkCreated(TargetButtonHandle,"Button")
SourceStringHandle = StringGadget(#PB_Any, 140, 10, 445, 25, "")
ChkCreated(SourceStringHandle,"Inputbox")
TargetStringHandle = StringGadget(#PB_Any, 140, 45, 445, 25, "")
ChkCreated(TargetStringHandle,"Inputbox")
SortAscOptionHandle = OptionGadget(#PB_Any, 140, 80, 100, 20, "Sort Ascending")
ChkCreated(SortAscOptionHandle,"Option")
SortDescOptionHandle = OptionGadget(#PB_Any, 140, 100, 100, 20, "Sort Descending")
ChkCreated(SortDescOptionHandle,"Option")
SetGadgetState(SortAscOptionHandle, 1)
SortNoCaseCheckboxHandle = CheckBoxGadget(#PB_Any, 260, 80, 120, 20, "Sort NoCase")
ChkCreated(SortNoCaseCheckboxHandle,"Checkbox")
DeleteBlankRowsCheckboxHandle = CheckBoxGadget(#PB_Any, 260, 100, 120, 20, "Delete Blank Rows")
ChkCreated(DeleteBlankRowsCheckboxHandle,"Checkbox")
StartButtonHandle = ButtonGadget(#PB_Any, 505, 80, 80, 50, "START")
ChkCreated(StartButtonHandle,"Button")
Repeat
EventID = WaitWindowEvent()
If EventWindow() = MainWindowHandle And EventID = #PB_Event_Gadget
If EventGadget() = SourceButtonHandle
File$ = OpenFileRequester("Please choose the file to read from", "", "Text (*.txt)|*.txt;*.bat|All Files (*.*)|*.*", 0)
If File$
If FileSize(File$) = -2 : Msg("A directory cant be the source",1) : File$ = "" : EndIf
SetGadgetText(SourceStringHandle,File$)
EndIf
EndIf
If EventGadget() = TargetButtonHandle
File$ = OpenFileRequester("Please choose the file to write to", "", "Text (*.txt)|*.txt;*.bat|All Files (*.*)|*.*", 0)
If File$
If FileSize(File$) = -2 : Msg("A directory cant be the target",1) : File$ = "" : EndIf
SetGadgetText(TargetStringHandle,File$)
EndIf
EndIf
If EventGadget() = StartButtonHandle
;Stringgadgets unbeschreibbar für User machen?
Repeat
If FileSize(GetGadgetText(SourceStringHandle)) = -1 : Msg("Sourcefile doesnt exist",1) : SetGadgetText(SourceStringHandle,"") : Break : EndIf
If FileSize(GetGadgetText(SourceStringHandle)) = -2 : Msg("Sourcefile cant be a directory",1) : SetGadgetText(SourceStringHandle,"") : Break : EndIf
If FileSize(GetGadgetText(TargetStringHandle)) = -2 : Msg("Targetfile cant be a directory",1) : SetGadgetText(TargetStringHandle,"") : Break : EndIf
If FileSize(GetGadgetText(TargetStringHandle)) >= 0
Result.l = MessageRequester("Request", "Targetfile already exists. Overwrite?", #PB_MessageRequester_YesNo)
If Result = #PB_MessageRequester_No : Break : EndIf
EndIf
ReadFileHandle = ReadFile(#PB_Any, GetGadgetText(SourceStringHandle))
WriteFileHandle = CreateFile(#PB_Any, GetGadgetText(TargetStringHandle))
If Not ReadFileHandle : Msg("Couldnt open Sourcefile") : Break : EndIf
If Not WriteFileHandle : Msg("Couldnt open Targetfile") : Break : EndIf
Dim SourceFileContent$(0)
x.l=0
While Eof(ReadFileHandle) = 0
ReDim SourceFileContent$(x)
SourceFileContent$(x) = ReadString(ReadFileHandle);Ascii, UF8 usw beachten? Was ist mit ReadStringFormat?
x+1
Wend
CloseFile(ReadFileHandle)
Flags.l = 0 : DelBlank.l = 0
If GetGadgetState(SortDescOptionHandle) = 1 : Flags+1 : EndIf
If GetGadgetState(SortNoCaseCheckboxHandle) = 1 : Flags+2 : EndIf
If GetGadgetState(DeleteBlankRowsCheckboxHandle) = 1 : DelBlank = 1 : EndIf
SortArray(SourceFileContent$(), Flags)
For x = 0 To ArraySize(SourceFileContent$())
If DelBlank = 1 And SourceFileContent$(x) = "" : Continue : EndIf
WriteStringN(WriteFileHandle, SourceFileContent$(x)) ;Ascii, UF8 usw beachten?
Next
CloseFile(WriteFileHandle)
MessageRequester("Info","Success")
Until #True
EndIf
EndIf
Until EventID = #PB_Event_CloseWindow
Auch wenn ich die Variable Flags rausnehme und nur die Konstante für NoCase einsetze funktioniert es nicht. Wie kommt das?
Ich dachte man könnte die Geschwindigkeit noch erhöhen indem man zB redim immer nur alle 1000 Zeilen für weitere 1000 Arraybestandteile macht und am Ende die überschüssigen mit redim abschneidet. Allerdings ist es selbst beim Sortieren von 213.142 Zeilen in unter einer Sekunde fertig. Aber schneller ist immer gut...

Dann habe ich mich gefragt ob man StringGadgets nach erstellen noch schreibgeschützt stellen kann. Dazu habe ich in der Hilfe nichts gefunden.
Und ich frage mich ob ich nicht auf ascii, utf8 usw Wert legen sollte. Bzw ReadStringFormat und sein BOM. Müsste man ja eigentlich um korrekt zu sortieren oder?
Und ansonsten? Gibts Verbesserungsvorschläge?
