Adressen von MySQL Importieren

Dieses Thema im Forum "Scripting und Automatisierung" wurde erstellt von enux, 28.10.2005.

  1. enux

    enux Thread Starter MacUser Mitglied

    Beiträge:
    43
    Zustimmungen:
    0
    MacUser seit:
    05.08.2005
    Moin,

    hat vielleicht jemand schonmal folgendes gemacht (oder kann mir bei der Realisierung helfen?): Ich möchte auf eine MySQL-Datenbank zugreifen, um mir Adressen zu besorgen und diese dann in das Adressbuch von OSX einpflegen. Und das alles per Applescript.
    Ich habe schonmal überlegt, per Shellscript die Daten in eine Datei zu schreiben und diese dann mithilfe eines Applescripts in das Adressbuch zu importieren.
    Schöner wäre es allerdings ohne diesen Zwischenschritt.

    Könnte man mit Applescript die Daten aus MySQL auslesen, sie in die Zwischenablage kopieren und von dort ins Adressbuch schreiben?

    Danke schonmal für jegliche Tipps und Hinweise!
     
  2. maceis

    maceis MacUser Mitglied

    Beiträge:
    16.645
    Zustimmungen:
    596
    MacUser seit:
    24.09.2003
    Theoretisch könnte das schon klappen, wobei ich nicht mit der Zwischenablage sondern mit Variablen und einer Schleife arbeiten würde.
    Beim "Apple Script -> Addressbuch" Teil können Dir sicher andere besser helfen als ich.

    Ansatzweise könnte das z.B. so aussehen:
    Die Abfrage der mysql Datenbank könntest Du in einer Schleife mit "do shell script" durchführen. Wie genau die Abfrage aussehen kann/muss hängt primär von der Struktur Deiner mysql Datenbank bzw. Tabelle ab.
    Wenn es eine forlaufende numerische id gibt, würde ich zunächst die Zahl der Datensätze feststellen (mit count() ) und dann in einer Schleife in AppleScript alle abbarbeiten. Wenn nicht alle ids vergeben sind (z.B weil Datensätze gelöscht wurden), könnte man mit "try ... end try" arbeiten.

    Ein völlig anderer Ansatz wäre, dass man einen dump der mysql Daten erstellt und diesen mit einem Parser-Skript für Appleskript aufbereitet.
    Ist aber sicher auch eine ziemliche Tüftelei.

    HTH

    btw: um wie viele Adressen geht es denn in etwa?
     
  3. enux

    enux Thread Starter MacUser Mitglied

    Beiträge:
    43
    Zustimmungen:
    0
    MacUser seit:
    05.08.2005
    Die Idee mit den Variablen ist interessant! Momentan schreibe ich die Ausgabe meines MySQL-Clients noch in eine Datei. Kann ich das in eine Applescript-Variable umleiten?

    Die Befehle sehen wie folgt aus:
    Applescript
    do shell script "/Applications/mysql_script/mysql.sh"
    Shellscript
    /sw/bin/mysql -h hostname -u test --password=**** Datenbank </Applications/mysql_script/mysql_tabelle> /Applications/mysql_script/mysql_out.txt

    Das, was hier in der Datei 'mysql_out' landet, hätte ich jetzt gerne in der Variable. Ist das möglich?

    Es handelt sich übrigens, meines Wissens, um mehr Adressen, als ich per Hand übertragen könnte...
     
  4. lengsel

    lengsel MacUser Mitglied

    Beiträge:
    4.627
    Zustimmungen:
    53
    MacUser seit:
    25.11.2003
    Vielleicht hilft Dir ja folgender Thread weiter:
    http://www.fischer-bayern.de/phpBB2/viewtopic.php?t=1689

    Wenn ich das richtig verstanden habe willst Du in AS mit Daten weiterarbeiten die ein Shellbefehl hervorgebracht hat. Das geht z.B. so:
    Code:
    set t to do shell script "ls ~/Desktop"
    
    mit t lässt sich dann weiterarbeiten.
    Ich würde vorschlagen in der Datenbank jeweils genau einen Datensatz abzufragen. Die Daten lassen sich dann z.B. als Liste (get t as list) ganz gut weiterverarbeiten. Da die Struktur vermutlich immer gleich ist, könnte man z.B. ein Konstrukt wie "get word 5 of list" nutzen um die Adresse (oder was auch immer) zu erhalten.
    Wenn der neue Eintrag im Adressbuch komplett ist könnte man ja evtl. nochmal ein Shellscript starten dass dem Datenbankeintrag eine "Markierung" der Art "wurde am soundsovielten in Addressbucheintrag umgewandelt" hinzufügt. Dann das Ganze einfach wiederholen.
    Die "Markierung" könnte z.B. dazu dienen das Script in Intervallen zu starten, und dann alle vor x Tagen exportierten Einträge zu prüfen oder was auch immer anderes damit zu machen.

    Grüße,
    Flo
     
  5. enux

    enux Thread Starter MacUser Mitglied

    Beiträge:
    43
    Zustimmungen:
    0
    MacUser seit:
    05.08.2005
    Prima, das funktioniert ja schonmal wunderbar!

    Da ist mir allerdings noch eine interessante Frage eingefallen:
    Wenn ich jetzt eine bestimmte Adresse aus meiner Datenbank abfragen will, muss ich dem MySQL-Befehl zwei ids übergeben, damit er mir das Gewünschte anzeigt.
    Jetzt wäre es doch schön, wenn ich diese Abfrage per Popup von Applescript realisiere. Da mein MySQL-Befehl allerdings in einer Datei für ein Shellscript liegt, weiß ich nicht so recht, wie ich das Ergebnis der Abfrage in diese Datei bekomme.
    Kann ich denn Applescript-Variablen in Textdateien verwenden?
     
  6. lengsel

    lengsel MacUser Mitglied

    Beiträge:
    4.627
    Zustimmungen:
    53
    MacUser seit:
    25.11.2003
    Ich denke nicht dass das funktioniert, aber poste doch mal den genauen Befehl den Du auf der Kommandozeile absetzt. Vielleicht lässt er sich ja "zerlegen", denn Terminalbefehle mit durch AS-Dialoge ermittelten Werten lassen sich recht gut realisieren.

    Beispiel:
    Code:
    
    set theResult to display dialog "Quellpfad" default answer ""
    set x to text returned of theResult
    
    set theResult to display dialog "Zielpfad" default answer ""
    set y to text returned of theResult
    
    set Befehl to "mv "
    set ScPfad to x
    set DestPfad to y
    set theFile to theFilename
    -- theFilename muss auch entsprechend abgefragt worden sein, z.B. mit choose file
    set MvExec to Befehl & ScPfad & theFile & " " & DestPfad & theFile
    -- display dialog MvExec
    -- nach Bedarf zur Kontrolle den String anzeigen lassen bevor er abgesetzt wird
    do shell script MvExec
    
    So müsste sich also auch ein Programm oder Skript mit per AS abgefragten Parametern dem Terminal übergeben lassen als hätte man den vollen Befehl getippt.

    Grüße,
    Flo
     
  7. enux

    enux Thread Starter MacUser Mitglied

    Beiträge:
    43
    Zustimmungen:
    0
    MacUser seit:
    05.08.2005
    Der Befehl gestaltet sich derzeit wie folgt:

    select Menschen.*, MenschFirma.* from Menschen, MenschFirma where Menschen.id='3' and MenschFirma.Mensch='3';

    Diese beiden ids sollen vom Benutzer während der Laufzeit angegeben werden.
    Die beiden Zahlen sind, soweit ich das überschaue, jeweils identisch. Der Benutzer müsste also nur eine Zahl eingeben.

    Wenn ich Dich richtig verstanden habe, bräuchte ich meine Datei mit dem Befehl darin überhaupt nicht, sondern könnte diesen direkt per Applescript an das Terminal schicken, richtig?
     
  8. lengsel

    lengsel MacUser Mitglied

    Beiträge:
    4.627
    Zustimmungen:
    53
    MacUser seit:
    25.11.2003
    Richtig.
    Wenn sich tatsächlich ausser den genannten IDs nichts ändert könnte man den ganzen Befehl ja im Script hardcoden, also der Logik des vorigen Beispiels folgend:
    Code:
    set Befehl to "select Menschen.*, MenschFirma.* from Menschen, MenschFirma where Menschen.id='Abfragevariable' and MenschFirma.Mensch='Abfragevariable';"
    
    Ich bin mir grad nicht 100%ig sicher ob man hier schon eine Abfragevariable einsetzen kann, falls nicht muss man halt mehrere Teile daraus machen:
    Code:
    set theResult to display dialog "ID eingeben:" default answer ""
    set theID to text returned of theResult
    
    set Befehl1 to "select Menschen.*, MenschFirma.* from Menschen, MenschFirma where Menschen.id="
    set Befehl2 to "and MenschFirma.Mensch="
    set Befehl3 to ";"
    
    set Exec to Befehl1 & id & Befehl2 & id & Befehl3
    
    Nur exemplarisch, keine Gewähr auf syntaktische Korrektheit.
    Wenn die IDs tatsächlich in beiden Fällen die gleichen sind ist das natürlich schön weil man sich eine Abfrage spart.

    Grüße,
    Flo
     
  9. enux

    enux Thread Starter MacUser Mitglied

    Beiträge:
    43
    Zustimmungen:
    0
    MacUser seit:
    05.08.2005
    Erstmal vielen Dank für Deine Hilfe!

    Das Applescript funktioniert jetzt und die gewünschte Adresse kann ausgelesen und auch importiert werden.
    Das ist schonmal klasse!

    Eine interessante Frage hätte ich aber noch:

    Die Adressen können jetzt z.B. in RagTime importiert werden, was aber leider momentan nicht sehr schön ist, das jedes Feld durch ein Tab getrennt ist.
    Nun zu meiner Frage: Ist es möglich, die Adresse von Applescript so zu formatieren, dass ich in Ragtime einen fertigen Adresskopf bekomme?
     
  10. lengsel

    lengsel MacUser Mitglied

    Beiträge:
    4.627
    Zustimmungen:
    53
    MacUser seit:
    25.11.2003
    Ich kenne Ragtime leider nicht gut genug um dazu was sagen zu können.
    Ich kann als (möglicherweise artverwandtes) Beispiel nur folgenden Code anbieten, den ich für eine Anwendung zur Rechnungserstellung nutze:

    Die Abfrage der Kundendaten aus dem Adressbuch:
    Code:
    tell application "Address Book"
    	set b to people of group "kunden" where name contains Kunde
    	set selected_card to b
    	tell item 1 of selected_card
    		set pfad_1 to note as string
    		set name_1 to name as string
    		set fname_1 to first name as string
    		set lname_1 to last name as string
    		set kdnr_1 to department as string
    		set mail_1 to value of email 1 as string
    		tell address 1
    			if street exists then
    				set street_1 to street as string
    				try
    					set street_1 to paragraph 1 of street_1
    				end try
    			else
    				set street_1 to ""
    			end if
    			
    			if city exists then
    				set city_1 to city as string
    			else
    				set city_1 to ""
    			end if
    			
    			if country exists then
    				set country_1 to country as string
    			else
    				set country_1 to ""
    			end if
    			
    			if zip exists then
    				set zip_1 to zip as string
    			else
    				set zip_1 to ""
    			end if
    		end tell
    	end tell
    end tell
    
    Kunde wurde vorher entsprechend per Dialog abgefragt.
    Der Zusammenbau der Adresse (zur späteren Verwendung in einem HTML-Dokument, deswegen die HTML-Tags zwischen den Adressteilen):
    Code:
    set theAdresse to name_1 & " <br>" & street_1 & "<br>" & zip_1 & "<br>" & country_1 as string
    
    set t to theAdresse as string
    
    Tabs habe ich da nirgends. Die Adresse wird wegen des HTMLs noch durch eine Entitykonversion gejagt, und dann in die HTML-Datei eingebaut.

    Vielleicht hilft Dir ja eine Suchen/Ersetzen Routine um die Tabs los zu werden. Das Zauberwort könnte allerdings auch "Apple Script Text Item Delimiters" sein. Hierzu findet sich im Forum von Fischer-Bayern reichlich Lesestoff.

    Grüße,
    Flo
     

Diese Seite empfehlen