Help us understand the problem. What is going on with this article?

MacNote3 からのデータ取り出しと、Writeへの移行

More than 3 years have passed since last update.

MacNote3 について

 Mac で階層構造で管理できるノートアプリとして、MacNote3 というアプリを愛用していた。

MacNote3 → http://nsek.net/SYW/software/japanese/macnote3/index.html

このアプリを愛用していたもう一つの理由は、iOS 機器で利用できる mmNote というアプリとの同期機能(手動)があって、 Mac と iPhone でノートを共有できることだった。
mmNote → http://nsek.net/SYW/software/iPhoneJ/mmnote/index.html

 ところが、ある時期から mmNote の動作が iOS のアップデートで動作しなくなり、 Mac でのみ利用しながら、代替えのアプリを探していた。

欲しかった機能は

  • 階層でノートを管理できること
  • 全文検索ができること
  • Mac と iPhone などとの連携ができること

と単純だったのですが、階層で管理できるのが見つからなかった。(Microsoft OneNote が良いかとも思ったのだけど、ノートとセクションというのがちょっとなじめなかった)

Write との出会い

 そんなときに、偶然、友人から Write というアプリを紹介してもらった。
Write → http://writeapp.net/
 Write は、多階層でノートが管理できるほか、Mac と iOS 機器との連携が、iCloud or DropBox で同期する方法で利用できる。

 更にうれしいのは、MarkDown記法 に対応していて、 iPhone のソフトキーボードでは、MarkDown に便利な記号が簡単に入力できるように工夫されている。MarkDown用ノートアプリ ともいえるほど。
 MarkDownのプリビュー機能や、HTML形式に変換出力や、PDF出力にも対応している。すごい。

 有料アプリではあるが、高くはないと思ったので、3種(Mac版、iPhone版、iPad版それぞれ別に購入が必要)とも購入して、本格的に移行しようと思い立った。

MacNote3からのデータ取り出し

 さて、移行するには現在保有している約400枚(?)のノートを MacNote3 から取り出す必要がある。

 幸い、私はリッチテキストは使っていなかったし、画像等の貼り付けもしていなかったので、テキストだけ取り出せば良かった。

 最初は、MacNote3が利用しているデータフォルダーから直接取り出そうと思ったが、ノートごとに保存されているデータは、XML形式(?)で、なおかつテキスト部分はBASE64のようなコード変換された形式だったので、単純にはできなかった。MacNote3にもノートをエキスポートする機能はあるものの、1ノート毎に手動で行うのは面倒だった。

 半ば諦めかけていたが、MacNote3はAppleScriptに対応していたことを思い出し、スクリプトエディタで、MacNote3 の用語説明を見たら、使えそうなクラス、メソッドがあったので、試行錯誤はあったものの、結果的には簡単なスクリプトで全ノートのテキストを一括して取り出すことができた。

MacNote3 から全ノートデータのテキストを取り出すスクリプト

 作成したのは、とりあえずノートのタイトルと本文を取り出し、それぞれの区切り行を加えて1つのテキストファイルに出力するスクリプト。できてしまえば、こんなに少ない行数でできる。

ManNote3export.scpt
tell application "MacNote3"
    set titleList to ""
    set saveFile to choose file name
    open for access saveFile with write permission
    set allPages to all pages
    repeat with aPage in allPages
        set pTitle to title of aPage
        set pText to text of aPage
        write "== MacNote title ==" & return to saveFile
        write pTitle & return to saveFile
        write "== MacNote text ==" & return to saveFile
        write pText & return to saveFile
        write "== MacNote end ==" & return to saveFile
        set titleList to titleList & pTitle & return
    end repeat
    close access saveFile
    display dialog "書き出しが終わりました。"
    set the clipboard to titleList
end tell

Write へのデータ移行

 AppleScript で取り出したテキストデータは、文字コードが SHIFT-JIS なので、文字コード変換が出来るテキストエディタなどで、 UTF-8 に変換しておきましょう。(iconv でコマンドラインで変換してみたら、内部のデータがおかしいのかエラーになったので、安易に Jedit X で変換した)

 MacNote3 のデータで、フォルダ(階層の区切り)は、本文無しのノートデータのようになっていたので、それを利用して、フォルダを作ってその中に1枚のノートを1ファイルとし、タイトルをファイル名にしたテキストデータを作るプログラムを Python で書いて、一気にノートを変換した。

 後は、DropBox の Write フォルダに放り込んで、Mac, iPhone, iPad と同期ができた。

 最初は AppleScript でやろうとしたが、文字コードの扱いが思うようにならなかったし、Write は AppleScript 非対応だった。で、慣れていない Perl で書いてみていたら、知人に「 Python が簡単だよ」と言われたので、Webの情報で勉強しながら書いてみたら、なるほど、助言どおり比較的簡単にできた。

Write 用へテキストファイルを分割する Python プログラム

 Python 初心者のコードなので、稚拙で恥ずかしいのですが、助言を期待して晒すことにしました。ご指摘や助言、大歓迎です。

SepNote.py
#!/usr/bin/python
# -*- coding: utf-8 -*-

import codecs
import os

odir = 'MacNote'
otitle = ""
odata = ""
ostart = 0

fin  = codecs.open('conv.txt','r','utf-8')

for row in fin:
    linedata = row.rstrip()
    if  '== MacNote title ==' in linedata: 
        ostart = 1
    elif '== MacNote text ==' in linedata: 
        ostart = 2
    elif '== MacNote end ==' in linedata:
        if len(odata)< 2:
            odir = otitle
        else:
            if not os.path.exists(odir): os.mkdir(odir)
            ofname = otitle.replace('/', '_')
            if len(ofname)>20: ofname = ofname[0:20]
            ofneme = odir + '/' + ofname + '.txt'
            fout_utf = codecs.open(ofneme,'w','utf-8')
            fout_utf.write(u'■' + otitle + '\n')
            fout_utf.write(odata)
            fout_utf.close()
        otitle = ''
        odata = ''
        ostart = 0
    elif ostart == 1:
        otitle = linedata
        odata = ''
    else:
        odata = odata + linedata + '\n'

fin.close()
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
No comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
ユーザーは見つかりませんでした