Palm のメモ魂を Android に注入する』や『Palm のメモ帳を Android に移すもうひとつの方法、OI Notepad』で書いたように、Palm から Android へのメモ帳の移行を試している。いろいろとアプリを探しては説明を読んで、インストールするかどうか考えて、使ってみたりみなかったりするのだが、過不足があったり、好みに合わなかったりということが多く、Palm で愛用の PsMemo のように「これで!」と思えるものとはなかなか出会えない。もちろん PsMemo と同じ機能がなければ絶対に嫌だということではなく、Android に適した魅力的で実用的なアプリがあればいい。

先日インストールしてみた miniNoteViewer は、PalmNote や OI Notepad のようなデータベース型のメモ帳ではなく、フォルダブラウザと簡単なテキストエディタを備え、ファイルシステム上のテキストファイルを管理、編集する方式のアプリケーションだ。このアプリがまず良いと思ったのは、編集画面だけでなくファイル一覧のフォントサイズを変更できるところ。いま使っている Lynx SH-10B では指で操作する必要はないので、行を細くして一覧性を上げることができればいいのにと思っていたところにドンピシャと来た。他の部分も多機能ではないがなかなか気が利いている。


そこで今回は Palm Desktop からエクスポートした CSV からデータを読み込み、カテゴリごとにフォルダを作って、その中にメモを一件ずつ個別のテキストファイルに書き出す PHP スクリプトを書いてみた。これで出力したファイルを Android の SD カードに持って行けば、miniNoteViewer 以外に任意のファイラとテキストエディタを組み合わせて使うこともできるというわけ。下に掲げるのは今回書いてみたスクリプトだ。PHP があればコマンドラインで実行できる。このスクリプトのファイル名が palm2text.php とすると、php palm2text.php 入力する CSV ファイル 出力先フォルダ のように入力して実行する。

このスクリプトは完全ではないので、場合によってはうまくいかないかもしれない。同じようなことを考えている人がもしいれば参考として見てもらいたい。このスクリプトは、出力先フォルダ の中にメモ帳のカテゴリ毎にフォルダを作り、その中にメモを一件ずつ個別のテキストファイルに書き出す。ファイル名はメモの一行目から決め、FAT 上でファイル名として使えない文字はアンダースコアに置き換える。同じファイル名がすでに存在する場合は追記する。テキストファイルの内容は Android で扱いやすい UTF-8 になる。

#!/usr/bin/php
<?php
//Config
//ファイル名のエンコード(UTF-8|SJIS ...)
$filename_encoding = 'SJIS';
//ファイル/フォルダ名に使わない文字
$disuse = '\:*?<>|/;';
//ファイル名の最大長(文字幅)
$filename_width = 124;
//ファイルの拡張子
$extention = '.txt';
//同じファイル名になったとき追記するか上書きするか(append|replace)
$samefilename = 'append';
//CSV の行を切る処理のための文字列
$entry_end = 'ENTRY_END';
//-----
mb_internal_encoding("UTF-8");
if (!isset($argv[2]) || $argv[2] == '') $argv[2] = './';
if (preg_match("/\/$/u", $argv[2])){
  $opdir = $argv[2];
} else {
  $opdir = $argv[2] . '/';
}
if (!file_exists($opdir)) mkdir($opdir, 0755, TRUE);
$csv = file_get_contents($argv[1]);
$csv = mb_convert_encoding($csv, 'UTF-8', 'SJIS');
$memos = array();
$csv = preg_replace("/\n/u", '', $csv);
$csv = preg_replace("/\r/u", "\n", $csv);
$csv = preg_replace("/\"{1}\n{1}\"{1}/su", '"'. $entry_end .'"', $csv);
$csv_ary = explode($entry_end, $csv);
foreach ($csv_ary as $entry){
  $body = preg_replace("/^\"{1}(.+)\"{1},{1}\"{1}[01]{1}\"{1},{1}\"{1}.+\"{1}$/su", '${1}', $entry);
  $body = preg_replace("/\n{2}/u", "\n", $body);
  $body = preg_replace("/\"{2}/u", "\"", $body);
  $foldr = preg_replace("/^\"{1}.+\"{1},{1}\"{1}[01]{1}\"{1},{1}\"{1}(.+)\"{1}$/su", '${1}', $entry);
  $foldr = preg_replace("/\n/", '', $foldr);
  $memos[$foldr][] = $body;
}
$disuse_q = preg_quote($disuse, '/');
if ($samefilename == 'append'){
  $fput_flag = FILE_APPEND;
} elseif ($samefilename == 'replace'){
  $fput_flag = '';
} else {
  $fput_flag = '';
}
foreach ($memos as $category => $memo){
  $directory = preg_replace("/[{$disuse_q}]/u", '_', $category);
  $directory = mb_convert_encoding($directory, $filename_encoding, 'UTF-8');
  if (!file_exists($opdir . $directory)) mkdir($opdir . $directory, 0755, TRUE);
  foreach ($memo as $text){
	$text = preg_replace("/^\n+/u", '', $text);
	$lines = explode("\n", $text);
	$fname = preg_replace("/[{$disuse_q}]/u", '_', $lines[0]);
	$fname = mb_strimwidth($fname, 0, $filename_width);
	$fname = mb_convert_encoding($fname, $filename_encoding, 'UTF-8');
	$fname = $opdir . $directory .'/'. $fname . $extention;
	if (file_exists($fname) && $samefilename == 'append'){
	  $text = "\n---\n" . $text;
	}
	if (file_put_contents($fname, $text, $fput_flag) === FALSE){
	  echo "Put contents to {$fname} ...failed.\n";
	} else {
	  echo "Put contents to {$fname} ...done.\n";
	}
  }
}
?>