Variable vergleichen und Unterschiede anzeigen Topic is solved

Stelle Fragen zur Programmierung mit Autohotkey

Moderator: jNizM

KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Variable vergleichen und Unterschiede anzeigen

21 Oct 2019, 18:47

Guten Abend,
gibt es eine Möglichkeit, zwei Variable zu vergleichen und die Unterschiede anzuzeigen.
z.B

Code: Select all

Var1 := "abc efg"
Var2 := "abc def"
Das ergebnis hier wäre : "def"

LG
gregster
Posts: 8999
Joined: 30 Sep 2013, 06:48

Re: Variable vergleichen und Unterschiede anzeigen

22 Oct 2019, 00:21

Bestimmt, aber gibt es bestimmte Regeln?

Sind die Strings und Substrings immer gleich lang, die Leerzeichen an der gleichen Stelle? Dann könnte man einfach Zeichen für Zeichen parsen und miteinander vergleichen.
Macht Groß-/Kleinschreibung einen Unterschied?
KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Re: Variable vergleichen und Unterschiede anzeigen

22 Oct 2019, 11:40

Hallo @gregster,
Macht Groß-/Kleinschreibung einen Unterschied?
Nein, das nicht.


Hintergrund ist folgender :
Bekomme morgens und abends E-mails von der Arbeitskollegen, kommt oft vor, das Angebot was ich morgens erhalten habe, sich zusätzlich abends ebenfalls in E-mail enthält (Weil sich der Preis, oder Bestand geändert hat, aber auch aus versehen) . Mir geht es jetzt darum, die Angebote die ich morgens erhalten habe von der Angebote die ich abends erhalte, abziehe, wenn es das gleiche ist, wenn sich bestand oder preis geändert hat und das soll am ende der Zeile vermerkt werden.

E-mails sind fast immer gleich aufgebaut:
Mit StrReplace, habe ich die Begrüßung und Signatur entfernt, mit RegExMatch geschafft, dass es so aussieht.
Morgen E-mail:

Code: Select all

12345	ek:19,99	vk:49,99	h-preis:35,99	bestand:2	
12346	ek:18,99	vk:45,99	h-preis:32,99	bestand:4
12347	ek:15,99	vk:39,99	h-preis:30,99	bestand:12
Abend E-mail:

Code: Select all

12344	ek:15,99	vk:49,99	h-preis:30,99	bestand:4	
12346	ek:18,99	vk:45,99	h-preis:32,99	bestand:4
12347	ek:15,99	vk:41,99	h-preis:31,99	bestand:10
12345	ek:19,59	vk:49,99	h-preis:35,99	bestand:5
12348	ek:19,99	vk:49,99	h-preis:39,99	bestand:5
LG
gregster
Posts: 8999
Joined: 30 Sep 2013, 06:48

Re: Variable vergleichen und Unterschiede anzeigen

23 Oct 2019, 05:23

Ok, damit kann man arbeiten. Melde mich später mal mit einer Idee (sobald Fieber und Schüttelfrost etwas nachlassen - ich häng gerade ziemlich durch :sick: ).
gregster
Posts: 8999
Joined: 30 Sep 2013, 06:48

Re: Variable vergleichen und Unterschiede anzeigen  Topic is solved

24 Oct 2019, 23:22

So, bin wieder halbwegs fit. Mein Vorschlag:

Code: Select all

morgens = 
(
12345	ek:19,99	vk:49,99	h-preis:35,99	bestand:2	
12346	ek:18,99	vk:45,99	h-preis:32,99	bestand:4
12347	ek:15,99	vk:39,99	h-preis:30,99	bestand:12
)

abends =
(
12344	ek:15,99	vk:49,99	h-preis:30,99	bestand:4	
12346	ek:18,99	vk:45,99	h-preis:32,99	bestand:4
12347	ek:15,99	vk:41,99	h-preis:31,99	bestand:10
12345	ek:19,59	vk:49,99	h-preis:35,99	bestand:5
12348	ek:19,99	vk:49,99	h-preis:39,99	bestand:5
)

result := compare(morgens, abends)
msgbox % result
ExitApp

compare(alt , neu){
		alt := createObj(alt) , neu := createObj(neu)	; transformiere Strings zu assoz. Arrays
		for key, obj in neu {							; loope durch alle Artikel(nummern) der abendlichen Email
			string .= key "`tek:" obj.ek "`tvk:" obj.vk "`th-preis:" obj["h-preis"] "`tbestand:" obj.bestand 
			if alt.HasKey(key)					; ist diese Artikelnummer bereits in der morgendlichen Email enthalten ?
			{									; ja, also vergleiche im Detail
				for bez, wert in obj
					if (wert != alt[key][bez]) 			; vergleiche alte und neue Einzelwerte
						string .= "`t**" bez ":" wert
				string .= "`n"
			}		
			else
				string .= "`t**NEU`n"  				; nein, neuer Artikel
		}
		return string								; gib Report zurück
}

createObj(string){  
	obj := {}
	Loop, Parse, string, `n, `r 						; durch alle Zeilen loopen
	{
		zeile := {}
		Array := StrSplit(A_LoopField , A_Tab)			; Zeile aufteilen
		for idx, elem in Array  {							
			if (idx > 1) {
				arr := StrSplit(elem, ":")
				zeile[arr.1] := arr.2					; key:value -Paare erzeugen
			}
		}
		obj[array.1] := zeile 		
	}
	return obj
}
ergibt folgenden (aufsteigend sortierten) Report:

Code: Select all

12344	ek:15,99	vk:49,99	h-preis:30,99	bestand:4	**NEU
12345	ek:19,59	vk:49,99	h-preis:35,99	bestand:5	**bestand:5	**ek:19,59
12346	ek:18,99	vk:45,99	h-preis:32,99	bestand:4
12347	ek:15,99	vk:41,99	h-preis:31,99	bestand:10	**bestand:10	**h-preis:31,99	**vk:41,99
12348	ek:19,99	vk:49,99	h-preis:39,99	bestand:5	**NEU
Unveränderte Zeilen haben keine Markierung (12346), neue zeigen **NEU an und die veränderten Zeilen zeigen die neuen, geänderten Werte an.

Müsste man natürlich noch was testen. Das Skript ist derzeit abhängig vom konkreten Datenformat im Beispiel und erwartet, dass der Input ein gewisses Format hat (vor allem Tabs als Trennmarken). Ggf. könnte man noch irgendwelche Konsistenzchecks hinzufügen, aber wenn der Output komisch aussieht, sollte man sich auf jeden Fall mal die Formatierung des Inputs näher anschauen ;)
KHA
Posts: 403
Joined: 21 Aug 2018, 11:11

Re: Variable vergleichen und Unterschiede anzeigen

25 Oct 2019, 10:28

Hallo @gregster vielen Dank und gute Besserung.
Habe heute getestet, funktioniert 1A.

Return to “Ich brauche Hilfe”

Who is online

Users browsing this forum: No registered users and 25 guests