[GastForen Programmierung/Entwicklung AppleScript Suche in verschachtelten Listen - möglich?

  • Suche
  • Hilfe
  • Lesezeichen
  • Benutzerliste
Themen
Beiträge
Moderatoren
Letzter Beitrag

Suche in verschachtelten Listen - möglich?

Anonym
Beiträge gesamt: 22827

6. Jun 2004, 18:54
Beitrag # 1 von 7
Bewertung:
(1432 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans, hallo Scripter,

ich bin an einem recht simplen Problem hängen geblieben und komm einfach nicht weiter. Vielleicht kann mir jemand von euch einen Lösungsweg aufzeigen, oder mir wenigstens sagen, dass ich richtig liege, mit meiner Vermutung, das es gar nicht funktioniert.

Problem:
Ich habe in einer Variablen (Liste) weitere Listen. Nun möchte ich innerhalb der 2ten Liste suchen und mir nur die passenden items übergeben lassen. Leider komm ich nicht weiter, da die "Suche alle Listen, deren 2. Element einen Wert x hat", wie ich Sie geschrieben habe nicht funktioniert.

myScript:

set xID to {"2", "3"}
set xContent to {{"1", "2", "companyID"}, {"2", "2", "companyName"}, {"3", "2", "companyStreet"}, {"4", "2", "companyName"}, {"5", "2", "companyZip"}, {"6", "2", "companyCity"}, {"1", "3", "personName"}, {"2", "3", "personSecondName"}}
repeat with i from 1 to (count every item of xID)
 set xIDno to (item i of my xID)
 set xNames to (get (item 3 of every item in xContent)) --gib mir alle 3. Elemente der 2ten Liste zurück
 log xNames
 set xNames to (get (every item whose item 2 in every item in xContent is xIDno)) --gib mir alle Listen, deren 2ter Eintrag den Wert xIDno hat
 log xNames
--Da gehts dann mit den Werten weiter
end repeat

Ich habe es nun so gelöst, das ich die Listen aufteile und auf eine Ebene reduziere (mit Schleife). Bei der Reduzierung schreib ich dann die Daten in die gewünschte Form. Das dauert mir aber zu lange und daher wollte ich es mit einer Abfrage lösen, wenn möglich.

Vielen Dank für jeden Tipp.

Grüße

Armin

Achja - fast vergessen: MacOS X.3.4. ScriptEditor 2.0
X

Suche in verschachtelten Listen - möglich?

Hans Haesler
  
Beiträge gesamt: 5826

6. Jun 2004, 22:16
Beitrag # 2 von 7
Beitrag ID: #418821
Bewertung:
(1431 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Armin,

mit der 'whose clause' (also dem Ausziehen der Elemente, welche eine gegebene Bedingung erfüllen) ist es so eine Sache. Es gibt mehr Fälle in denen sie nicht funktioniert als solche in denen es klappt.

In Deinem Fall würde ich ebenfalls eine Repeat-Schleife einsetzen, aber direkt mit der Liste 'xContent':
---
set xID to {"2", "3"}
set xContent to {{"1", "2", "companyID"}, {"2", "2", "companyName"}, {"3", "2", "companyStreet"}, {"4", "2", "companyName"}, {"5", "2", "companyZip"}, {"6", "2", "companyCity"}, {"1", "3", "personName"}, {"2", "3", "personSecondName"}}
set xNames to {}
repeat with i from 1 to count of xID
  set xIDno to (item i of xID)
  repeat with j from 1 to count of xContent
    set curItem to item j of my xContent
    if item 2 of curItem is xIDno then
      set end of xNames to curItem
    end if
  end repeat
  --Da gehts dann mit den Werten weiter
end repeat
---

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#418820]

Suche in verschachtelten Listen - möglich?

Anonym
Beiträge gesamt: 22827

6. Jun 2004, 22:41
Beitrag # 3 von 7
Beitrag ID: #418822
Bewertung:
(1431 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Hans,

vielen Dank für deine Info.
Das hab ich mir schon so gedacht, leider! Nun kann ich mir aber wenigstens sicher sein, das ich nicht zu do.. war. Bleibt mir aber nix anderes übrig als die langsame Schleife zu nehmen.

my - by list
Du hast mir mal den Tipp gegeben, das der "my" Befehl einen schnelleren Zugriff auf die Werte einer Liste ermöglicht. Es ist mir aufgefallen, das dieser Zusatz nicht von alle Programmen akzeptiert wird z.B. "SystemEvents" in MacOSX.3.4 - hat ein bisserl gedauert, bis ich auf den Fehler gestoßen bin - Mein TIPP -> erst mal ohne "my" schreiben/testen und den Speedbump später hinzufügen, dann findet man den Fehler schneller.

Viele Grüße

Armin


als Antwort auf: [#418820]

Suche in verschachtelten Listen - möglich?

Hans Haesler
  
Beiträge gesamt: 5826

6. Jun 2004, 22:53
Beitrag # 4 von 7
Beitrag ID: #418823
Bewertung:
(1431 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Armin,

danke für Deinen TIPP !

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#418820]

Suche in verschachtelten Listen - möglich?

Hans Haesler
  
Beiträge gesamt: 5826

13. Jun 2004, 21:39
Beitrag # 5 von 7
Beitrag ID: #418824
Bewertung:
(1431 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Armin,

übrigens &#133; kann es sein, dass wenn das 'my' nicht akzeptiert wurde, es in einem
Handler verwendet wurde? Denn in diesem Fall muss die Variable der betreffenden
Liste innerhalb des Handlers als 'global' definiert sein. Auch wenn diese Deklaration
schon zu Beginn des Scripts steht.

Hier als Illustration ein praktisches Script, welches nicht-URL-konforme Zeichen
in hexadezimale Schreibweise umwandelt (dieses Script stammt von der Web-Site
<http://www.apple.com/applescript/scripteditor/12.html>
Den Code habe ich allerdings gestrafft und eine nichtbenutzte Zeile entfernt).
---
set aString to "hello wörld!"
encodeText(aString)

-- dieser Handler prüft die Textkette
on encodeText(aString)
  set okayChars to "abcdefghijklmnopqrstuvwxyz0123456789_"
  set charList to {}
  repeat with aChar in aString
    set aChar to contents of aChar
    if aChar is in okayChars then
      set end of charList to aChar
    else
      set end of charList to encodeChar(aChar)
    end if
  end repeat
  return (charList as string)
end encodeText

-- dieser Handler wandelt ein unzulässiges Zeichen um
on encodeChar(aChar)
  global hexList
  set ascNum to (ASCII number of aChar)
  set hexList to {"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "A", "B", "C", "D", "E", "F"}
  set x to item ((ascNum div 16) + 1) of my hexList
  set y to item ((ascNum mod 16) + 1) of my hexList
  return ("%" & x & y)
end encodeChar

-->"hello%20w%9Arld%21"

Der Wortzwischenraum (ASCII-Nummer 32) wird zu '%20'. Dies in hexadezimaler Schreibweise:
(= 2 mal 16). Dasselbe gilt für das "ö" (MacRoman = 154 = hex 9A) und das Ausrufezeichen
(ASCII = 33 hex = 21).

Die 'global'-Definition innerhalb des zweiten Handlers ist notwendig, wenn das 'my'
vor der Variable der Liste steht. Beide habe ich eingefügt. Aber in diesem Beispiel
bringt es keine Geschwindigkeitssteigerung. Dazu bräuchte es eine längere Liste.

Eine (sehr geringe) Steigerung bringt das Ersetzen der Liste durch eine Textkette.
Und damit fällt der 'my'-Trick weg:
---
on encodeChar(aChar)
  set ascNum to (ASCII number of aChar)
  set hexString to "0123456789ABCDEF"
  set x to character ((ascNum div 16) + 1) of hexString
  set y to character ((ascNum mod 16) + 1) of hexString
  return ("%" & x & y)
end encodeChar
---

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#418820]

Suche in verschachtelten Listen - möglich?

Anonym
Beiträge gesamt: 22827

15. Jun 2004, 07:58
Beitrag # 6 von 7
Beitrag ID: #418825
Bewertung:
(1431 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Zitat von Hans Haesler übrigens &#133; kann es sein, dass wenn das 'my' nicht akzeptiert wurde, es in einem Handler verwendet wurde?

Ja - das 'my' ist in einem Handler

Zitat von Hans Haesler Denn in diesem Fall muss die Variable der betreffenden Liste innerhalb des Handlers als 'global' definiert sein. Auch wenn diese Deklaration
schon zu Beginn des Scripts steht.

Das geht erst mal nicht, da ich die Variable nicht als 'global' benutze, sondern extra mit dem Handleraufruf übergebe. AppleScript meldet dann einen Fehler, wenn ich die Variable nochmals als global deklarieren möchte. Ich werde das nocheinmal separat probieren und nachvollziehen, denn in diesem Projekt geht es nicht so einfach (mein 1. AppleScript Studio Projekt).

Vielen Dank für deinen Tipp

Grüße

Armin


als Antwort auf: [#418820]

Suche in verschachtelten Listen - möglich?

Hans Haesler
  
Beiträge gesamt: 5826

15. Jun 2004, 10:11
Beitrag # 7 von 7
Beitrag ID: #418826
Bewertung:
(1431 mal gelesen)
URL zum Beitrag
Beitrag als Lesezeichen
Hallo Armin,

ja, es ist etwas vertrackt. Und gar nicht einfach zu beschreiben.

0. Im obigen Beispiel wird die Liste im selben Handler, in welchem sie adressiert wird, gebildet. Damit der 'my'-Trick klappt, muss die Variable innerhalb dieses Handlers als 'global' bezeichnet sein: 'global hexList'.

1. Wenn die Liste im 'top level' (also eigentlich im 'run handler', wenn auch ohne eine solch explizite Angabe) des Scripts definiert wird, dann muss sie überhaupt nicht als 'global' bezeichnet werden und wird trotzdem innerhalb eines Handlers erkannt. Aber: Das 'my' muss vorangestellt sein.

2. Wieder ist die Liste im top level definiert, wird aber als Parameter weitergereicht: encodeText(aString, hexList). In diesem Fall wird die Bezeichnung als 'global' innerhalb des Handlers beim Prüfen der Syntax mit einer Fehlermeldung quittiert, weil dieselbe Variable nicht gleichzeitig als 'local' und als 'global' bezeichnet werden kann. 'local hexList' wird toleriert, aber diese Zeile ist gar nicht notwendig: das 'my' funktioniert ohne Hilfe.

3. Diesmal wird die Liste innerhalb eines anderen Handlers aufgebaut und wieder als Parameter weitergereicht. Wieder kommt beim Prüfen der Syntax die Fehlermeldung bei der Zeile 'global hexList'. Und 'local hexList&#146; wird akzeptiert, hilft aber nichts, weil das 'my' weg muss, damit es bei der Ausführung keine Fehlermeldung gibt. Aber: Wenn nun 'global hexList' im 'top level' steht, dann  funktioniert das 'my' wieder!

Ein Widerspruch, ich weiss. Und ob bei einer genügend langen Liste der Geschwindigkeitsschub in allen Fällen eintritt habe ich (noch) nicht getestet. Trotzdem: Ich werde Dir diese Beispiele zumailen und Deine Antwort nach meinem Urlaub, anfangs Juli, lesen.

Tschüss,

Hans Haesler <hsa@ringier.ch>


als Antwort auf: [#418820]
X