Wolle-77 •--->


Anmeldedatum: 25.02.2003 Beiträge: 449 Wohnort: Geldern
|
Verfasst am: 19.08.2005 - 00:39 Titel: Listeneintäge intelligent ZUSAMMENFASSEN |
|
|
Hallo zusammen.
Ich habe mal eine nicht ganz leicht zu verstehende schlanke Routine erstellt, um Listeneinträge zusammenzufassen (und nicht nur einfach doppelte entfernen; wie es das im Forum schon gibt).
Nehmen wir an, wir haben die unten zu sehende Liste; beispielsweise einen Lieferschein oder eine Zeiterfassung. Es gibt mehrere Einträge doppelt (in diesem Fall die 1, die 5 und die 7).
Die Liste wird sortiert (anhand der korrekten Spalte – der Ordnungsnummer. Das ist in dem Fall Spalte 4, Buchstabe 1 (habe ich zur leichteren Anpassung zuerst festgelegt in sp und bu).
set sp to "4"
set bu to "1"
set liste to "
1977 350 1,6 349867 Eintrag 7
1977 350 2,3 398292 Eintrag 2
1977 350 0,4 394832 Eintrag 3
1977 350 0,1 947383 Eintrag 4
1977 350 0,3 215504 Eintrag 1
1977 350 0,3 645637 Eintrag 5
1977 350 0,9 218283 Eintrag 6
1977 350 0,7 645637 Eintrag 5
1977 350 1,2 215504 Eintrag 1
1977 350 1,1 349867 Eintrag 7"
----- Anfang der eigentlichen Routine
set liste to do shell script "echo \"" & liste & "\" | tr '\\r' '\\n' | sort -n -k " & sp & "." & bu & " | tr '\\n' '\\r'"
set my text item delimiters to ASCII character (13)
set liste to every text item of liste
set liste_duplikatezusammen to {}
set my text item delimiters to ""
repeat with i from 1 to (count of liste) in liste
try
set tempEintrag to item i of liste
if ((characters 14 thru 19 of tempEintrag) as string) is not in (liste_duplikatezusammen as string) then
set the end of liste_duplikatezusammen to tempEintrag
else
set tz to ((((characters 10 thru 12 of tempEintrag) as string) as real) + (((characters 10 thru 12 of (item (i - 1) of liste)) as string) as real) as string)
set last item of liste_duplikatezusammen to ((characters 1 thru 9 of tempEintrag) & tz & (characters 13 thru -1 of tempEintrag)) as string
end if
end try
end repeat
----- Ende der eigentlichen Routine
set my text item delimiters to return
return (liste_duplikatezusammen as string)
return liste_duplikatezusammen
Als Ergebnis erhalten wir sauber und korrekt folgendes Ergebnis:
"1977 350 1,5 215504 Eintrag 1
1977 350 0,9 218283 Eintrag 6
1977 350 2,7 349867 Eintrag 7
1977 350 0,4 394832 Eintrag 3
1977 350 2,3 398292 Eintrag 2
1977 350 1,0 645637 Eintrag 5
1977 350 0,1 947383 Eintrag 4"
Also die Liste ist nach Zahlen sortiert (der Ordnungsnummernspalte und aufsteigend, nicht einfach nur alphanumerisch) und die Einträge sind jeweils der dritten Spalte nach zusammengerechnet:
Aus 0,3 und 1,2 ist 1,5 geworden...
Mit reinen AppleScript-Befehlen wäre solch eine Routine wesentlich länger vom Quellcode und auch wesentlich langsamer. Ein wichtiger Teil ist die vorherige Behandlung über ein kleines Shell Script. Dadurch funktioniert dieses Snippet auch nur unter Mac OS X. _________________ Martin Wolter
--
Apple rocks the planet! |
|