Variable vergleichen und Unterschiede anzeigen

Post a reply


In an effort to prevent automatic submissions, we require that you complete the following challenge.
Smilies
:D :) ;) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :!: :?: :idea: :| :mrgreen: :geek: :ugeek: :arrow: :angel: :clap: :crazy: :eh: :lolno: :problem: :shh: :shifty: :sick: :silent: :think: :thumbup: :thumbdown: :salute: :wave: :wtf: :yawn: :facepalm: :bravo: :dance: :beard: :morebeard: :xmas: :HeHe: :trollface: :cookie: :rainbow: :monkeysee: :monkeysay: :happybday: :headwall: :offtopic: :superhappy: :terms: :beer:
View more smilies

BBCode is ON
[img] is OFF
[flash] is OFF
[url] is ON
Smilies are ON

Topic review
   

Expand view Topic review: Variable vergleichen und Unterschiede anzeigen

Re: Variable vergleichen und Unterschiede anzeigen

Post by KHA » 25 Oct 2019, 10:28

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

Re: Variable vergleichen und Unterschiede anzeigen

Post by gregster » 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 ;)

Re: Variable vergleichen und Unterschiede anzeigen

Post by gregster » 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: ).

Re: Variable vergleichen und Unterschiede anzeigen

Post by KHA » 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

Re: Variable vergleichen und Unterschiede anzeigen

Post by gregster » 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?

Variable vergleichen und Unterschiede anzeigen

Post by KHA » 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

Top