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! | 
			 
		  |