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
So, bin wieder halbwegs fit. Mein Vorschlag:
[code]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
}[/code]
ergibt folgenden (aufsteigend sortierten) Report:
[code]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[/code]
Unveränderte Zeilen haben keine Markierung (12346), neue zeigen [c]**NEU[/c] an und die veränderten Zeilen zeigen die neuen, [u]geänderten[/u] 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 ;)