FindMapElement

Anfängerfragen zum Programmieren mit PureBasic.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FindMapElement

Beitrag 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 
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FindMapElement

Beitrag 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.
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FindMapElement

Beitrag 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?
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag 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
Benutzeravatar
Sicro
Beiträge: 963
Registriert: 11.08.2005 19:08
Kontaktdaten:

Re: FindMapElement

Beitrag 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.
Bild
Warum OpenSource eine Lizenz haben sollte :: PB-CodeArchiv-Rebirth :: Pleasant-Dark (Syntax-Farbschema) :: RegEx-Engine (kompiliert RegExes zu NFA/DFA)
Manjaro Xfce x64 (Hauptsystem) :: Windows 10 Home (VirtualBox) :: Neueste PureBasic-Version
Martin66119
Beiträge: 282
Registriert: 03.01.2005 11:36

Re: FindMapElement

Beitrag 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
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8807
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Re: FindMapElement

Beitrag 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?
Antworten