Seite 6 von 9

Re: FindMapElement

Verfasst: 25.06.2014 21:37
von Martin66119
Bin doch noch dazu gekommen zu schauen ob es klappt.

Nun habe ich mal in Datei1 folgende Daten
30
300
3999

In Datei2:
30
3999
3999

Nur in Datei1: 300

Das Ergebnis stimmt. Wobei eigentlich auch ein weiterer Unterschied besteht, der beim Code von Nic gefunden wird.

Nur in Datei1: 300
Nur in Datei2: 3999

Nun kommtes darauf an was ich eigentlich will. Ich glaube, da habe ich mich bisher nicht eindeutig ausgedrückt. Wenn ich nun darüber nachdenke, dann sollte auch die 3999 als Differenz angezeigt werden.

Grüße

Re: FindMapElement

Verfasst: 26.06.2014 01:05
von NicTheQuick
Nichts einfacher als das.

Code: Alles auswählen

EnableExplicit

Structure CompareMapStruc
	ExistsInFile1.i
	ExistsInFile2.i
EndStructure

#SIMULATE = #True

#Slots = 512 ; Dieser Wert erhöhen, um die Zugriffsgeschwindigkeit bei großen Datenmengen zu erhöhen (siehe PB-Hilfe)
NewMap Compare.CompareMapStruc(#Slots)
Define key$

CompilerIf #SIMULATE
	Compare("30")\ExistsInFile1 + 1
	Compare("300")\ExistsInFile1 + 1
	Compare("3999")\ExistsInFile1 + 1
	
	Compare("30")\ExistsInFile2 + 1
	Compare("3999")\ExistsInFile2 + 1
	Compare("3999")\ExistsInFile2 + 1
	Compare("3999")\ExistsInFile2 + 1
CompilerElse
	If ReadFile(0, "Datei1.txt")
		While Not Eof(0)
			key$ = ReadString(0)
			Compare(key$)\ExistsInFile1 + 1
		Wend
		CloseFile(0)
	EndIf
	
	If ReadFile(0, "Datei2.txt")
		While Not Eof(0)
			key$ = ReadString(0)
			Compare(key$)\ExistsInFile2 + 1
		Wend
		CloseFile(0)
	EndIf
CompilerEndIf

ForEach Compare()
	If Compare()\ExistsInFile1 > Compare()\ExistsInFile2
		Debug "Nur in Datei 1: >" + MapKey(Compare()) + "<"
		Debug "     Anzahl: " + Str(Compare()\ExistsInFile1 - Compare()\ExistsInFile2)
		Debug "---------------------------------------------"
	ElseIf Compare()\ExistsInFile1 < Compare()\ExistsInFile2
		Debug "Nur in Datei 2: >" + MapKey(Compare()) + "<"
		Debug "     Anzahl: " + Str(Compare()\ExistsInFile2 - Compare()\ExistsInFile1)
		Debug "---------------------------------------------"
	EndIf
Next 

Re: FindMapElement

Verfasst: 27.06.2014 20:46
von Martin66119
Hallo Nic,

vielen Dank.
Ich glaube, ich nehme deinen ersten Code, da dieser auch doppelte Einträge anzeigt. Der Code von matbal scheint zwar etwas schneller zu sein, wobei dieser dopplte Einträge nicht anzeigt.

Vielen Dank für eure Mühe und Gedult mit mir. Ich denke ich habe nun alles was ich brauche.
Euch allen ein schönes Wochenende

Re: FindMapElement

Verfasst: 27.06.2014 21:12
von NicTheQuick
Irrtum. Du hast nur nicht richtig geschaut. Er zeigt doch doppelte Einträge an. Da steht doch dann "Anzahl: 2", wenn eine Zeile doppelt vorkommt.

Re: FindMapElement

Verfasst: 27.06.2014 21:40
von Martin66119
Meinst du den Code von matbal den du modifiziert hast? In diesen hast du

Code: Alles auswählen

CompilerIf #SIMULATE
;    Compare("30")\ExistsInFile1 + 1
;    Compare("300")\ExistsInFile1 + 1
;    Compare("3999")\ExistsInFile1 + 1
;    
;    Compare("30")\ExistsInFile2 + 1
;    Compare("3999")\ExistsInFile2 + 1
;    Compare("3999")\ExistsInFile2 + 1
;    Compare("3999")\ExistsInFile2 + 1
CompilerElse
eingebaut. Was bewirkt denn das.

__________________________________________________
Code-Tags hinzugefügt
08.07.2014
RSBasic

Re: FindMapElement

Verfasst: 27.06.2014 22:21
von NicTheQuick
Ist das wirklich nicht zu verstehen?

Das simuliert halt zwei Dateien, in denen pro Zeile diese Zahlen drin stehen, weil ich keine Lust hatte extra "Datei1.txt" und "Datei2.txt" zum Testen zu erstellen.
Verstehst du überhaupt irgendwas an dem Code?

Re: FindMapElement

Verfasst: 27.06.2014 23:03
von Martin66119
Hallo Nic,

diesen Teil hatte ich mal auskommentiert und der Code hat dann geklappt. Also mehr oder weniger try and error. Ansonsten verstehe ich so 80% vom Code. Mehr leider nicht. Wie auch immer. Der Vergleich ist sehr schnell.

Nun habe ich aber alles was ich brauche. Das ist echt toll, wie schnell das nun geht im Vergleich zu meinem Code, der 120 ms brauchte. Herzlichen Dank

Re: FindMapElement

Verfasst: 28.06.2014 00:49
von Sicro
Martin66119 hat geschrieben:Meinst du den Code von matbal den du modifiziert hast? In diesen hast du

CompilerIf #SIMULATE
; Compare("30")\ExistsInFile1 + 1
; Compare("300")\ExistsInFile1 + 1
; Compare("3999")\ExistsInFile1 + 1
;
; Compare("30")\ExistsInFile2 + 1
; Compare("3999")\ExistsInFile2 + 1
; Compare("3999")\ExistsInFile2 + 1
; Compare("3999")\ExistsInFile2 + 1
CompilerElse

eingebaut. Was bewirkt denn das.
Das sind nur Beispieldaten, um die Modifikation direkt zu testen. Die entscheidende Modifikation von NicTheQuick befindet sich woanders.
Martin66119 hat geschrieben:[...] diesen Teil hatte ich mal auskommentiert [...]
Das Auskommentieren ist nicht erforderlich, einfach oben bei "#SIMULATE" "#False" angeben.

Re: FindMapElement

Verfasst: 28.06.2014 12:49
von Martin66119
Guten Morgen,

Code: Alles auswählen

   If ReadFile(0, "Datei1.csv")
      While Not Eof(0)
         key$ = ReadString(0)
         Compare(key$)\ExistsInFile1 + 1
      Wend
      CloseFile(0)
   EndIf
In der Schleife wird jede einzelne Zeile eingelesen und key$ zugewiesen. Dann in die Structure
die eine Map ist in Compare(key$)\ExistsInFile1 reingeschrieben und die Adresse um eins hochgezählt. Verstehe ich das richtig?

Was mich etwas wundert ist, dass der Code von matbal die Auswertung in ca. 1-2 ms erledigt und der Code von Nic 18ms braucht. Klar bei dem Code von Nic ist noch 2x SortList drin.

Grüße

Re: FindMapElement

Verfasst: 28.06.2014 13:07
von NicTheQuick
Martin66119 hat geschrieben:Guten Morgen,
Moin moin.

Code: Alles auswählen

   If ReadFile(0, "Datei1.csv")
      While Not Eof(0)
         key$ = ReadString(0)
         Compare(key$)\ExistsInFile1 + 1
      Wend
      CloseFile(0)
   EndIf
In der Schleife wird jede einzelne Zeile eingelesen und key$ zugewiesen. Dann in die Structure
die eine Map ist in Compare(key$)\ExistsInFile1 reingeschrieben und die Adresse um eins hochgezählt. Verstehe ich das richtig?
Stimmt.
Was mich etwas wundert ist, dass der Code von matbal die Auswertung in ca. 1-2 ms erledigt und der Code von Nic 18ms braucht. Klar bei dem Code von Nic ist noch 2x SortList drin.
Und was wundert dich dann genau?