Forenindex » Programmierung/Entwicklung » AppleScript » List of Records

List of Records

Anonym
Beiträge gesamt: 22827

28. Mai 2005, 12:03
Bewertung:

gelesen: 1999

Beitrag als Lesezeichen
Hallo liebe Gemeinde,

Versuche einen List of Records zu erstellen, und aus diesem wiederum eine Teilenge zu bekommen, auf die eine bestimmtes Kriterium zutrift.

Habe ein Beispiel geschrieben, wie der Code ungefähr aussehen sollte, nur so funktioniert es nicht richtig, vieleicht kann mir einer sagen, was ich machen soll, damit es läuft.

Eine Schleife will ich nicht benutzen, in der ich jedes Element der Liste anpacke, da Die Liste in Wirklichkeit über 10.000 Einträge haben wird, und das den Verlauf sehr stark verlangsammen wird...

Ich hoffe mir kann da einer Helfen.

Danke im Voraus..

MrLight :-)
Hier der Beispielcode...

Zitat set tableData to {{|name|:"Bart Simpson", city:"Springfield", zip:"19542", age:12}, ¬
     {|name|:"Ally McBiel", city:"Chicago", zip:"91544", age:28}, ¬
     {|name|:"Joan of Ark", city:"Paris", zip:"53255", age:36}, ¬
     {|name|:"King Tut", city:"Egypt", zip:"00245", age:45}, ¬
     {|name|:"James Taylor", city:"Atlanta", zip:"21769", age:42}}
set tableNewEntry to {{|name|:"King Nik", city:"Central City", zip:"00100", age:33}}

set tableData to tableData & tableNewEntry --[olive] Hier hänge ich weitere Einträge an ...[/olive]

set sucheEintrag to {} --[olive] deffiniere die Liste[/olive]
set sucheEintrag to (every record of tableData whose "city" is "Springfield") as record --[olive] hier ziehe ich eine Teilmänge heraus[/olive]

--[olive] Das Ergebnis, das ich erreichen will soll wie folgt aussehen:[/olive]
--[olive] sucheEintrag = {     {|name|:"Bart Simpson", city:"Springfield", zip:"19542", age:12}, ¬[/olive]
--[olive]                      {|name|:"King Nik", city:"Springfield", zip:"00100", age:33}}[/olive]



display dialog city of record 1 of tableData --[olive] dieser geht noch[/olive]
display dialog city of record 1 of sucheEintrag --[olive] dieser nicht (Applescript Fehler: Fehler in einer Skripterweiterung.)[/olive]


-------------------------
[This script was automatically tagged for color coded syntax by [url=http://homepage.mac.com/jonn8/as/]Convert Script to Markup Code]

List of Records

Hans Haesler
  
Beiträge gesamt: 5826

29. Mai 2005, 23:12
Bewertung:

gelesen: 1998

Beitrag als Lesezeichen
Hallo MrLight,

herzlich willkommen im dtpro-Forum! :-)

Unter welchem Mac OS bist Du unterwegs?

Gruss, Hans

List of Records

Anonym
Beiträge gesamt: 22827

30. Mai 2005, 00:00
Bewertung:

gelesen: 1998

Beitrag als Lesezeichen
@ Hans Haesler

Danke für die warme Begrüßung.

MAC OS X 10.3.9.

Zur Zeit behelfe ich mir mit einer Lösung, die so ähnlich aussieht:


Zitat set tableData to {{|name|:"Bart Simpson", city:"Springfield", zip:"19542", age:12}, ¬
     {|name|:"Ally McBiel", city:"Chicago", zip:"91544", age:28}, ¬
     {|name|:"Joan of Ark", city:"Paris", zip:"53255", age:36}, ¬
     {|name|:"King Tut", city:"Egypt", zip:"00245", age:45}, ¬
     {|name|:"James Taylor", city:"Atlanta", zip:"21769", age:42}}
set tableNewEntry to {{|name|:"King Nik", city:"Springfield", zip:"00100", age:33}}

set tableData to tableData & tableNewEntry

set tableDataRef to a reference to tableData --[olive] um die Zugriffe zu beschleunigen[/olive]
--[olive]set testThen to (current date) -- time tester (Sekunden)[/olive]
set sucheEintrag to {}
repeat with myRecordReference in tableDataRef
     if city of myRecordReference is "Springfield" then copy (myRecordReference as record) to the end of sucheEintrag --[olive] Ist schneller als einfaches "set x to x & y"[/olive]
end repeat
--[olive]display dialog ((current date) - testThen) -- time tester  (Sekunden)[/olive]

display dialog city of record 1 of tableData
display dialog city of record 1 of sucheEintrag


Doch das wird wahrscheinlich immer noch zu langsam sein. Ich überlege, ob ich das nicht komplett einer Routine in C überlassen sollte, nur wie ich Daten aus Applescript an C übergebe und auch wieder zurück, dafür sind meine Kenntnisse nicht aussreichend, noch wie ich so ein Datenformat in C abbilde. (Hatte erst vor paar Wochen mit C angefangen....)

Für Nutzliche Tips und Vorschläge bin ich immer zu haben, mit Dank im Voraus, verbleibe ich...

Mr Light :-)

-------------------------
[This script was automatically tagged for color coded syntax by [url=http://homepage.mac.com/jonn8/as/]Convert Script to Markup Code]

List of Records

Hans Haesler
  
Beiträge gesamt: 5826

30. Mai 2005, 11:50
Bewertung:

gelesen: 1998

Beitrag als Lesezeichen
Hallo Mr Light,

zunächst ein paar Tips zu Deiner Lösung.

Der Record 'tableNewEntry' sollte mit 'set end' an 'tableData' angefügt werden. Sonst wird zuerst
eine Kopie des ganzen Records 'tableData' erstellt, an welchen dann mit dem "&"-Zeichen die neuen
Einträge angehängt werden. Bei umfangreichen Listen kann das dauern. Aufgepasst: Anstelle der
doppelten Akkoladen nur einfache verwenden.

Zum Stoppen der Zeit reicht 'current date' nur, wenn die Ausführung relativ lange dauert. Zum
Messen kürzerer Abstände kann man zum Beispiel die Scripting Addition "GetMilliSec" von Hideaki
Iimori einsetzen. Download an dieser Adresse: http://osaxen.com/getmillisec.html

Zum Beschleunigen von Zugriffen auf Listen oder Records hat mich 'a reference to' nie überzeugt.
Damit sich ein messbares Resultat ergibt habe ich die Einträge Deines Beispiels von 6 auf 106
erhöht. Ohne 'a reference to' = 0.060 Sekunden. Mit 'a reference to' = 0.015 Sekunden. Und wieder
ohne 'a reference to', aber mit einem simplen 'my' (vor 'tableData') = 0.006 Sekunden.

Das 'copy xyz to the end of sucheEintrag' und 'set end of sucheEintrag to xyz' sind gleichwertig
(in Sachen Geschwindigkeit). Ich bevorzuge die zweite Form.
---
set tableData to {{|name|:"Bart Simpson", city:"Springfield", zip:"19542", age:12}, ¬
   {|name|:"Ally McBiel", city:"Chicago", zip:"91544", age:28}, ¬
   {|name|:"Joan of Ark", city:"Paris", zip:"53255", age:36}, ¬
   {|name|:"King Tut", city:"Egypt", zip:"00245", age:45}, ¬
   {|name|:"James Taylor", city:"Atlanta", zip:"21769", age:42}}
set tableNewEntry to {|name|:"King Nik", city:"Springfield", zip:"00100", age:33}

set end of tableData to tableNewEntry

set t1 to GetMilliSec -- time tester (Tausendstelsekunden)
set sucheEintrag to {}
repeat with aRecord in my tableData
   if city of aRecord is "Springfield" then set end of sucheEintrag to (aRecord as record)
end repeat
set t2 to GetMilliSec -- time tester (Tausendstelsekunden)
set tt to (t2 - t1) / 1000
display dialog "" & tt

sucheEintrag

---

Im übrigen sehe ich gerade, dass Dir in einem anderen Forum kompetent geholfen wurde!

Gruss, Hans

List of Records

Anonym
Beiträge gesamt: 22827

30. Mai 2005, 12:09
Bewertung:

gelesen: 1998

Beitrag als Lesezeichen
@Hans Haesler

Als erstes Danke für deine Hilfe. Ich werde mir deine Ratschläge noch genauer anschauen. Lesen ist eine Sache verstehen eine andere.

Dass ich mir in mehreren Foren zu helfen versuche, solltest Du mir nicht übel nehmen. :-) Zumal jeder Einblick eine Hilfe wert ist. Aus der Summe ziehe ich mir dann das beste heraus. Weiter ist es mir lieber wenn ich in einem Deutschsprachigem Forum Hilfe finde, da ich da die Erklärungen besser verstehe.

Ich lebe in einer 5 Sprachigen Familie, und da ist Englisch nicht ganz so gut hängen geblieben, da Sprachen doch nicht meine Stärke sind.

Zum weiteren bin ich DTP-ler, und fühle mich in diesem Forum, auch wenn ich neu bin, besser aufgehoben.

Zum Beispiel finde ich deinen Tip: 'sollte mit 'set end' an 'tableData' angefügt' sehr interessant. Werde ich auf hjeden Fall übernehmen...

Melde mich, wenn ich weiter gekommen bin.

Liebe Grüße

Mr Light ...

List of Records

Hans Haesler
  
Beiträge gesamt: 5826

30. Mai 2005, 15:21
Bewertung:

gelesen: 1998

Beitrag als Lesezeichen
Hallo Mr Light,

bitteschön.

Im allgemeinen sind Cross-Poster nicht gern gesehen. Doch bin ich toleranter. Und wenn
sich der Fragesteller wieder meldet, habe ich ihm schon verziehen. Es gibt aber immer
wieder Fälle, wo sich einer nicht mal die Zeit nimmt, eine Antwort zu bestätigen.

Das Anfügen des neuen Records ist mit 'set end' ist der gleiche Fall, wie bei der Liste
in der Wiederholschleife. Wie schon erwähnt, wenn das Anhängen mit "&" vorgenommen wird,
dann wird jedes Mal die komplette, vorhandene Liste kopiert. Beim 'set end of' zwar auch,
aber nur jedes sechzehnte Mal. Deshalb ist diese Konstruktion effizienter.

Gruss, Hans