メモ(MacOS標準アプリ)の中身をプレーンテキストファイルに出力する

概要と結果

MacOS標準アプリの『メモ (Notes)』の中身を移行しようと思ったら、ファイル実体がSQLiteのバイナリデータだった。

このバイナリを以下の通りまあまあ許容できる範囲でプレーンテキスト化することに成功した。

f:id:tatsuzaki98:20210517225234p:plain
Before(メモアプリの画面)
f:id:tatsuzaki98:20210517225301p:plain
After(プレーンテキスト化した。末尾にASCII記号が混入してしまう。)

以下のリポジトリで公開している。(かなりやっつけ仕事で書いているので万が一使う場合は自己責任で)

github.com

バイナリデータの正体はMacBinary Archive

SQLiteのBlobをファイルとして保存したところ、MacBinary Archiveというファイルらしい。

f:id:tatsuzaki98:20210517225851p:plain
メモのファイル実体

MacOSなら標準のArchive Utilityで解凍できるが、Terminalからひらく場合は単に

$ open file

とすれば良い。

バイナリデータの解凍先はutf-8と非utf-8が混在する

バイナリデータを解凍したは良いものの、以下のようにutf-8と非utf-8のコードが混在している。書式などのデータだろうか。

f:id:tatsuzaki98:20210517230450p:plain
解凍したblob

ここまで来たらあとはutf-8の仕様に沿った部分だけdecodeしてやればよい。

utf-8を16進数文字列として読み込んだ時、ascii文字は20から7e、非ascii文字はe.[8-b].[8-b].である。

以下のような正規表現で無理矢理取り出す。

# python3
re.findall(r'(e. [8-b]. [8-b].) | ([2-7][0-f])', hex_str)

ここまでの処理をPython3とMakefileでまとめたので、詳細は冒頭のリポジトリを参照のこと。

以上。