2011/8/30追記:
iBackupBot - iTunes Backup Manager for iPhone, iPod Touch, iPadで、iOS5のbeta版(beta4あたりで確認)のバックアップファイルからsms.dbを取り出せました。使い方は簡単だと思われますが、追ってアップしたいと思います。
[追記]*1
SMSメッセージはたくさん溜まると、起動にえらく時間がかかるようになり、急いでいるときにはイライラします。どんどん消してしまえばよいのですが、相手によっては SMSメッセージをメールのようにずっと取っておきたい、と思うのです。彼女とのやり取りとか…。
ところがバックアップはできても、テキストデータとして取り出す方法はかなり面倒なようです。大きく分けて2つ分かりましたので、まずは、バックアップデータから取り出す方法をメモしておきます。
必要なもの
SMS.db を取り出す
まず iTunes で iPhone の最新のバックアップを取ります。
次に
iTunesにバックアップしたiPhoneのデータを漁る方法 - iPhone.goodegg.jp *4
こちらの記事を参考に
iPhone OS Files/Library/SMS/sms.db
を取り出します。
添付画像などは
iOS Files/Library/SMS/Parts/
以下に入っていました。
テキストデータの取り出し
本文を取り出す方法は何通りかあります。目的によって選んでください。SQL文に詳しい方は、SQLite Database Browser.app または Base.app などのツールで「message」というテーブルのカラム名を調べることで、自由に加工ができます。また、ツールから直接csvファイルなどに出力もできます。
拙記事SQLiteのDBファイルを編集できるGUIツール for OSX で、GUIで扱えるSQLツールをいくつかご紹介しています。今のところ、気に入っているのはFireFoxやThunderbirdのアドオンで提供されている「SQLite Manager」です。CSVで取り出せてしまえば、Excelで加工など簡単にできますのでお手軽かと思います。(2012/1/22追記)
以下は、sqlite3をコマンドラインでたたく場合の方法です。取り出したいSMSの電話番号を"08099999999"とします。
・sms.db を適当なフォルダに置きます。
・ターミナル.appを起動し、そのフォルダに移動します。
方法1:SMS.txt というテキストファイルに書き出したいとき
sqlite3 sms.db sqlite> .mode column sqlite> .width 3 3 19 70 sqlite> .output SMS.txt sqlite> select replace(rtrim(flags,'3'),'2','=> '), replace(rtrim(flags,'2'),'3','<= '),datetime(date, 'unixepoch'),text from message where address='08099999999' order by date; sqlite> .q nkf -Ww --in-place SMS.txt
方法2:1の変形
sqlite3 sms.db sqlite> .explain sqlite> .header off sqlite> .width 3 3 19 90 0 0 0 sqlite> .output SMS.txt sqlite> select replace(rtrim(flags,'3'),'2','=> '), replace(rtrim(flags,'2'),'3','<= '),datetime(date, 'unixepoch'),text from message where address='08099999999' order by date; sqlite> .q
方法4:SMS.csv に出力してExcelなどで見る
sqlite3 sms.db sqlite> .mode csv sqlite> .output SMS.csv sqlite> select datetime(date, 'unixepoch'),text from message where address='08099999999' order by date; sqlite> .q
方法3:HTMLで見やすくする(SMS08099999999.htmlというHTMLファイルができる)
以下をシェルスクリプトとして実行
#!/bin/sh db=sms.db addr="08099999999" f1=/tmp/f1 f2=SMS${addr}.html echo " .mode html .output $f1 select replace(rtrim(flags,'3'),'2','=> '), replace(rtrim(flags,'2'),'3','<= '),datetime(date, 'unixepoch'),text from message where address='$addr' order by date; .q " | sqlite3 $db echo '<html><head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> ' > $f2 echo "<title>SMSバックアップ</title></head><body><h1>${addr}のバックアップ</h1> " >> $f2 echo '<table style="width: 90%; background-color: rgb(143, 181, 194);" border="2"> ' >> $f2 cat $f1 >> $f2 echo '</table> </body></html>' >> $f2 echo "HTML file $f2 was created ..."
実は、もっとお馬鹿な方法もあります。
それは次の記事で。
*1:iPhone Backup Extractor.appは、iOS5のスキーマには対応していないようです。アップデートを待ちたいと思います。
*2:iPhone / iPod Touch Backup Extractor
*3:MacPorts の使い方 - maruko2 Note.参考
*4:>>筆者の方、非常に参考になりました。ありがとうございました。