Re: Textdatei in LinkedList einlesen
Verfasst: 19.04.2013 15:08
Das Abgleichen der beiden Dateien läßt sich sehr simpel gestalten, wenn man die Zeilen in beiden Listen vorher sortiert. Dann braucht man beim Vergleichen beide Listen nur ein einziges Mal durchgehen.
Falls die Reihenfolge der Zeilen wichtig ist, muß man sich beim Einlesen auch die Zeilennummer merken. Nach dem Vergleich kann man dann wieder nach Zeilennummer sortieren...
(Ich habe es mit PB 5.0 geschrieben. in PB 5.1 müssen die Konstanten für SortStructuredList() angepaßt werden, weil sie sich geändert haben)
Falls die Reihenfolge der Zeilen wichtig ist, muß man sich beim Einlesen auch die Zeilennummer merken. Nach dem Vergleich kann man dann wieder nach Zeilennummer sortieren...
(Ich habe es mit PB 5.0 geschrieben. in PB 5.1 müssen die Konstanten für SortStructuredList() angepaßt werden, weil sie sich geändert haben)
Code: Alles auswählen
Structure ZeileStruc
Text$ ; Zeileninhalt
n.i ; Zeilennummer
EndStructure
Procedure LoadFile(File$, List Text.ZeileStruc())
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())
; 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
Protected e1 = FirstElement(Text1())
Protected e2 = FirstElement(Text2())
Repeat
If Text1()\Text$ < Text2()\Text$
If e1 : e1 = NextElement(Text1()) : EndIf
ElseIf Text1()\Text$ > Text2()\Text$
If e2 : e2 = NextElement(Text2()) : EndIf
ElseIf Text1()\Text$ = Text2()\Text$
DeleteElement(Text1())
DeleteElement(Text2())
If e1 : e1 = NextElement(Text1()) : EndIf
If e2 : e2 = NextElement(Text2()) : EndIf
EndIf
Until e1 = 0 Or e2 = 0
; 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
NewList Text1.ZeileStruc()
NewList Text2.ZeileStruc()
Define File1$ = "Text1.txt"
Define File2$ = "Text2.txt"
LoadFile(File1$, Text1())
LoadFile(File2$, Text2())
CompareText(Text1(), Text2())
Debug "Nur in Text1 enthalten:"
ForEach Text1()
Debug Text1()\Text$
Next
Debug "Nur in Text2 enthalten"
ForEach Text2()
Debug Text2()\Text$
Next