Adressen von MySQL Importieren

enux

Mitglied
Thread Starter
Dabei seit
05.08.2005
Beiträge
53
Reaktionspunkte
4
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!
 
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?
 
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...
 
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
 
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?
 
enux schrieb:
Prima, das funktioniert ja schonmal wunderbar!
...Kann ich denn Applescript-Variablen in Textdateien verwenden?

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
 
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?
 
enux schrieb:
...
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?

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
 
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?
 
enux schrieb:
...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?

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
 
Okay, ich habe das inzwischen auf Shell-Ebene mit "awk" gelöst.
Das einzige Problem dabei: Umlaute. Habe es schon mit "sed" und einem Applescript versucht, aber er scheint das Zeichen nicht zu finden. Z.B. "‰" für ä.

Hast Du da vielleicht noch eine Idee?
 
enux schrieb:
...Das einzige Problem dabei: Umlaute. Habe es schon mit "sed" und einem Applescript versucht, aber er scheint das Zeichen nicht zu finden. Z.B. "‰" für ä.

Also ich löse das wie oben erwähnt mit einem Suchen/Ersetzen Script von Snow (Fischer-Bayern). Sieht bei mir dann so aus:

Code:
-- Entitykonversion
set SuchListe to {"ä", "ö", "ü", "Ä", "Ö", "Ü", "ß"}
set ErsatzListe to {"&auml;", "&ouml;", "&uuml;", "&Auml;", "&Ouml;", "&Uuml;", "&szlig;"}
set OriginalText to t
-- Für jeden Umlaut muss ein kompletter
-- Schleifendurchlauf erfolgen.
repeat with i from 1 to (count of SuchListe)
	set SuchText to item i of SuchListe
	set Ersatztext to item i of ErsatzListe
	set OriginalText to SuchenUndErsetzen(OriginalText, SuchText, Ersatztext)
end repeat
-- Suchen und Ersetzen mit AppleScript
on SuchenUndErsetzen(derText, SuchText, Ersatztext)
	set AppleScript's text item delimiters to the SuchText
	set the itemListe to every text item of derText
	set AppleScript's text item delimiters to the Ersatztext
	set derText to the itemListe as string
	set AppleScript's text item delimiters to ""
	return derText
end SuchenUndErsetzen

Was man durch was erstzen will läßt sich ja beliebig ändern.

Grüße,
Flo
 
Dein wunderbares Script hilft mir leider nicht weiter.
Ich habe es jetzt auch schon geschafft, der bash latin1 beizubringen (dank dem macuser-forum). Dort wird das Ergebnis der Abfrage nun auch korrekt angezeigt.
In Applescript ist das mit "do shell script" leider nicht der Fall :(

Welche Shell benutzt Applescript denn? Die bash ist es ja scheinbar nicht?
Bzw. kann ich Applescript vielleicht irgendwie vorschreiben, welche Shell es benutzen soll?
 
Seltsam, demnach sollte es keine Probleme geben.
Was ich jetzt vermute ist, dass das die Einstellungen, die ich am Terminal vorgenommen habe, nur für die jeweilige Terminalsitzung gelten und Applescript nicht interessieren.
Bleibt die Frage, wie man diese Einstellungen von Applescript an die bash übergeben kann.

Oder könnte es sein, dass Applescript Mist baut, wenn es die Ausgabe in eine Variable schreibt?
 
enux schrieb:
Seltsam, demnach sollte es keine Probleme geben.
Was ich jetzt vermute ist, dass das die Einstellungen, die ich am Terminal vorgenommen habe, nur für die jeweilige Terminalsitzung gelten und Applescript nicht interessieren.
Bleibt die Frage, wie man diese Einstellungen von Applescript an die bash übergeben kann.

Also ich habe das Dokument so verstanden dass die bash für AS eben nicht die Standardshell ist, sondern die gezielt aufrufen muss wenn man möchte dass AS sie benutzt. Dann jedoch sollten die Standardeinstellungen der bash (die Du ja angepasst hast?) gelten

enux schrieb:
Oder könnte es sein, dass Applescript Mist baut, wenn es die Ausgabe in eine Variable schreibt?

Das kannst Du ja ganz leicht mit einem "get Variable" oder noch deutlicher mit "display dialog Variable" überprüfen.

Grüße,
Flo
 
Ich bin der Meinung, das gemacht zu haben... AS habe ich mit "do shell script '/bin/bash; <rest des befehls>...'" mitgeteilt, dass die bash zu benutzen ist.
Ich bin auch zwischendurch mal wieder auf eine ältere Version des Scripts zurück gegangen, wo das Ganze gleich in eine Datei und nicht in eine Variable oder die Zwischenablage geschrieben wird.
Auch hier stimmen die Umlaute nicht. Es ist zum verzweifeln...
 
enux schrieb:
Ich bin der Meinung, das gemacht zu haben... AS habe ich mit "do shell script '/bin/bash; <rest des befehls>...'" mitgeteilt, dass die bash zu benutzen ist.
Ich bin auch zwischendurch mal wieder auf eine ältere Version des Scripts zurück gegangen, wo das Ganze gleich in eine Datei und nicht in eine Variable oder die Zwischenablage geschrieben wird.
Auch hier stimmen die Umlaute nicht. Es ist zum verzweifeln...

Ich hatte auch mal ein Problem mit Umlauten beim Schreiben/auslesen aus Dateien, da hat man mir hier: http://www.fischer-bayern.de/phpBB2/viewtopic.php?t=1732&highlight=
geholfen. Vielleicht hilfts Dir ja auch...

Grüße,
Flo
 
Zurück
Oben Unten