筆まめのデータをSQLiteに取り込む

かれこれ、放置してしまいましたが、以前の続編です。
今回は、前回の失敗をふまえて作戦を変更しました。

まず、ContactXML に書き出すまでは、これ以外に選択肢がないので、変更はありません。

次に XML を PHP で parse するのをやめて、Safari を使うことにします。
そして、Safari を AppleScript で制御して、JavaScript によりデータを SQL 文に変換、それを AppleScript から SQLite に書き出す、という方法で変換することにしました。


早速、書き出した XML を Safari に読み込ませてみます。
Web Inspector で XML が parse された様子が視覚的に確認でき、データの構造が容易に把握できます。
これが、Safari を使うことにした最大の理由です。

データの構造は、実際の筆まめの内部はカード型データベースになっていると思うのですが、ContactXML では、大まかには、次のようになっています。

[cc_xml]







[/cc_xml]

ContactXMLItem は、筆まめでの 1 件分の住所データに相当します。

なので、[cci_JavaScript]document.getElementsByTagName(‘ContactXMLItem’).length[/cci_JavaScript] で、住所録のデータを取得することができ、各エレメントを順次 SQL 文に変換していけばよいことになります。

まず、ContactXMLItem には、lastModifiedDate という属性が付与されていて、これは筆まめ上でのそのカードの最終更新日時になります。実際には次のようなデータです。

[cc_xml]


[/cc_xml]

この XML で用いられる日付のフォーマットは、RFC3339 形式というようですが、JavaScript では、そのままでは Date オブジェクトに変換できません。
とりあえず、文字データとして、そのまま取り扱うこととします。

[cc_JavaScript]
cards = document.getElementsByTagName(‘ContactXMLItem’);
for (i = 0; i < cards.length; ++i) { card = cards[i]; lastModifiedDate = card.getAttribute('lastModifiedDate'); // do something... } [/cc_JavaScript] 次に、PersonName の中を見ていきます。 [cc_xml]



山田 太郎
太郎
山田




[/cc_xml]

基本的に、PersonName はこのカードの世帯主の姓および名、そしてそれらのふりがなが記録されているので、PersonNameItem が複数存在することはないはずです。

また、法人などで名を入力しなかった場合、FirstName は存在しません。

よって、この部分を読み出すには、以下のようになります。

[cc_JavaScript]
card = document.querySelector(‘ContactXMLItem’);
person = {};
LastName = card.querySelector(‘PersonName PersonNameItem LastName’);
person.lastName = LastName.textContent;
person.lastNamePronunciation = LastName.getAttribute(‘pronunciation’);
FirstName = card.querySelector(‘PersonName PersonNameItem FirstName’);
person.firstName = FirstName ? FirstName.textContent : ”;
person.firstNamePronunciation = FirstName ? FirstName.getAttribute(‘pronunciation’) : ”;
JSON.stringify(person);
// {“lastName”:”山田”,”lastNamePronunciation”:”ヤマダ”,”firstName”:”太郎”,”firstNamePronunciation”:”タロウ”}
[/cc_JavaScript]

続いて、Address を見ていきます。

[cc_xml]




150-0041
東京都
渋谷区
神南
1-1-1
東京都 渋谷区 神南 1-1-1




[/cc_xml]

AddressItem には、locationType 属性が付与されていて、自宅は Home、会社は Office となります。つまり、AddressItem はカードに対して最大 2 つ存在する可能性があります。

一言欄の変換

[cc_xml]
1997\m\m\m\m\m\m\m\m\m\m\m\m\m\m2010年賀状一言欄
\m\m

[/cc_xml]

[cc_JavaScript]
a = document.querySelector(‘ExtensionItem[name=X-NYCardComment]’).textContent.split(/\\m/);
for (i = 0; i < 16; ++i) console.log(+a[0]+i, +a[i+1]); [/cc_JavaScript] これは、以前に書きかけていたものですが、Safari ではなく、Chrome を使ったほうが良さそうなので、それは次のエントリーで。

にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしへ
にほんブログ村 ライフスタイルブログ 薪ストーブ暮らしに参加しています。 励みになりますので、足あとがわりに、ランクアップにご協力下さい。

Leave a Reply