Ich glaube, du hast die meine Vorschläge noch nicht angesehen oder nicht verstanden. Hier mal ein vollständiger Demo-Code mit Zeitmessung.
CreateDatenFile() erstellt eine Datei zum Testen mit Zufallszahlen.
LoadFile() lädt eine Textdatei in eine Liste
CompareText() vergleicht zwei Listen und kennzeichnet Duplikate
SaveFile() speichert eine Liste wieder als Textdatei
Ich erstelle also zwei Dateien.
Ich lade sie in zwei Listen.
Ich gleiche die beiden Listen ab, dann weiß ich, wo überall Duplikate sind
Ich speichere vier Dateien. Die beiden Dateien, die die gleichen Einträge enthalten unterscheiden sich nur in der Sortierung ihrer Einträge, da sie einmal von der ersten Datei stammen, und einmal von der zweiten Datei.
Das reine heraussuchen von Doppelten Einträgen dauert bei mir mit 100.000 Einträgen in den Dateien unter einer Sekunde. Bei einer Million Einträgen in den Dateien im einstelligen Sekundenbereich. (6 Sekunden im Schnitt)
Code: Alles auswählen
EnableExplicit
Structure ZeileStruc
Text$ ; Zeileninhalt
n.i ; Zeilennummer
dup.i ; Duplikat
EndStructure
Procedure CreateDatenFile(File$, Anzahl)
; Erstellt eine Datei mit verschiedenen Zahlen
Protected i
If CreateFile(0, File$)
For i = 1 To Anzahl
WriteStringN(0, Str(Random(Anzahl)))
Next i
CloseFile(0)
EndIf
EndProcedure
Procedure LoadFile(File$, List Text.ZeileStruc())
; Lädt eine Datei in eine Liste
Protected n
If ReadFile(0, File$)
While Not Eof(0)
AddElement(Text())
With Text()
\Text$ = ReadString(0)
\n = n
n + 1
EndWith
Wend
CloseFile(0)
EndIf
ProcedureReturn n
EndProcedure
Procedure CompareText(List Text1.ZeileStruc(), List Text2.ZeileStruc())
; Vergleicht zwei Listen
; Beide Texte sortieren
SortStructuredList(Text1(), #PB_Sort_Ascending, OffsetOf(ZeileStruc\Text$), #PB_Sort_String)
SortStructuredList(Text2(), #PB_Sort_Ascending, OffsetOf(ZeileStruc\Text$), #PB_Sort_String)
; In beiden Dateien zeilen weise einmal von oben nach
; unten durchgehen und vergleichen
; Solange e1 und e2 nicht NULL sind, ist das Ende der Listen nicht erreicht.
Protected e1 = FirstElement(Text1())
Protected e2 = FirstElement(Text2())
While e1 And e2
If Text1()\Text$ < Text2()\Text$
e1 = NextElement(Text1())
ElseIf Text1()\Text$ > Text2()\Text$
e2 = NextElement(Text2())
ElseIf Text1()\Text$ = Text2()\Text$
Text1()\dup = 1 ; Duplikat in 1 markieren
Text2()\dup = 1 ; Duplikat in 2 markieren
e1 = NextElement(Text1())
e2 = NextElement(Text2())
EndIf
Wend
; Sortierung rückgängig machen
SortStructuredList(Text1(), #PB_Sort_Ascending, OffsetOf(ZeileStruc\n), #PB_Sort_Integer)
SortStructuredList(Text2(), #PB_Sort_Ascending, OffsetOf(ZeileStruc\n), #PB_Sort_Integer)
EndProcedure
Procedure SaveFile(File$, List Text.ZeileStruc(), dup)
; Speichert eine Liste in eine Datei
If CreateFile(0, File$)
ForEach Text()
If Text()\dup = dup
WriteStringN(0, Text()\Text$)
EndIf
Next
CloseFile(0)
EndIf
EndProcedure
OpenConsole()
NewList Text1.ZeileStruc()
NewList Text2.ZeileStruc()
Define File1$ = "Datensatz1.txt"
Define File2$ = "Datensatz2.txt"
Define t
PrintN("Erstelle Datensatz1")
CreateDatenFile(File1$, 100000)
PrintN("Erstelle Datensatz1")
CreateDatenFile(File2$, 100000)
PrintN("Lade Datensatz1")
LoadFile(File1$, Text1())
PrintN("Lade Datensatz2")
LoadFile(File2$, Text2())
t = ElapsedMilliseconds()
PrintN("Vergleiche")
CompareText(Text1(), Text2())
PrintN(#CRLF$ + "Dauer: " + Str(ElapsedMilliseconds() - t) + " ms" + #CRLF$)
PrintN("Speichere 'Nur in 1'")
SaveFile("Nur in 1.txt", Text1(), 0)
PrintN("Speichere 'Nur in 2'")
SaveFile("Nur in 2.txt", Text2(), 0)
PrintN("Speichere 'Gleiche aus 1'")
SaveFile("Gleiche aus 1.txt", Text1(), 1)
PrintN("Speichere 'Gleiche aus 2'")
SaveFile("Gleiche aus 2.txt", Text2(), 1)
PrintN("ENDE")
Input()