昨日の続き。
ソニーのPaSoRi端末(電子カードリーダー)で、PASMOの直近20件の明細を、以下のように読み取った。

20140902SFV

昨日に引き続いてプライバシーまるだしだ。
このデータを、ネット家計簿マネーフォワードに読み込む。

まず、PaSoRiのデータを、CSV形式でエクスポート(出力)する。
CSV形式はExcel的な表形式ソフトであれば読み取れるデータで、数値と文字がカンマで区切ってある。
カンマ区切りファイル(Comma Seperated Values)とも言う。
SF Card Viewer2では[メニュー]から[ファイルに出力]するとCSVが保存できる。

このCSV、表計算ソフトで開くとこんな風に見える。
ここではLibreOfficeを使っている。
LibreOfficeはフリーソフトでありながらExcelで開ける表は大抵開けるのでおすすめだ。

20140903Libre1

ところで、CSVの実の姿はカンマ区切りのテキストであって、エディタで開くとこんな漢字になる。
ここではMac上で動作するフリーウェアCotEditorを使っている。

20140903csv1

ところで、このファイルの中には当然マネーフォワードが不要なデータも入っているし、データの順番も違う。
マネーフォワードにはウィザード的なものも入っていて、直接このCSVを読み込んだあとで、ここに日付が入っていますよ、ここに金額が貼っていますよと手動で指示することもできるが、どうもうまくいかない。
また、入場駅、出場駅をくっつけて項目にしたいが、そういう小細工も難しい。
なんとかこのCSVの段階で加工してやりたい。

ということで、このブログを参考にデータを加工した。

無料家計簿「マネーフォワード」へ他の家計簿アプリから移行するためのデータ取込方法 | 経理と事務の効率化。あと簿記

いろいろかいつまむと、こういう形式に加工してやればよい。

20140903Libre2

20140903Libre2

内容を解説する。
まず、表計算ソフトや数学の行列の場合、横の並び(row)を行といい、縦の並び(column)を列という。
行はツクリの「〒」形の上の部分が横になっているから、列はツクリの「刂」の部分が縦になっているから覚えればいいと思う。

最初に「計算対象」という列をつくる。
この列は振替(銀行から出して財布に入れるとか)などの、収入でも支出でもない場合にゼロにするものだ。
今回はすべて1にすればよい。
「日付」はそのまま転記すればよい。
「内容」だが、「PASMO移動 事業者 入場駅〜事業者 出場駅」と凝ってみた。
次に金額だが、マイナス1を掛けている。
保有金融機関は「PASMO」にする。
これはマネーフォワードに口座を登録するときに手入力したと思うがさだかではない。

次に「大項目」「中項目」だが、電車に乗った場合(元データの「メモ」列が空の場合)は「交通費」「電車」にした。
たまに汽車にも乗るだろうし、バスにも乗るだろうが、無視した。
次に、物販購入の場合(元データの「メモ」列が「物販」の場合)は「内容」を「PASMO物販」とし、「大項目」「中項目」を「食費」「カフェ」に、メモ欄を「物販」にした。
駅でPASMOを使って何かを買うときは、99.9999%の確率で自販機で缶コーヒーを買っているのだ。
だからこれでいいことにした。

次に、メモ欄が半角カナで「オートチャージ」の行は、間引くことにした。
ぼくは東急TOPS&カードからオートチャージされるのだが、これはもうマネーフォワードでカタがついている(カードがマイナスになり、PASMOがプラスになっている)のだ。
だからこっちは間引いていい。

次に、金額がゼロの行は、例の「窓出」も含めてエラー行として間引くことにした。
「窓出」が記録されないのは寂しい気もするが、結局見ないのでこれで良い。

以上、ここまで持ってくるとマネーフォワードで何のエラーもなく、すんなりデータが移行できる。

さて、ここまでの変換は、「職場のExcel魔神」のような人であれば案外手作業でアッという間に出来てしまうかもしれないが、せっかくだから自動化した。
ExcelにはVBAというマクロ言語がついているし、LibreOfficeはLibreOffice Basic、BeanShell、JavaScript、Python、Java(コンパイル要)という5つのマクロ言語がついている。
(すげえな!)
Google Driveの表計算ソフトも、Google Apps ScriptというJavaScriptで自動化できるようで、これもいずれ挑戦してみたい。

しかしながら今回は、テキスト=>テキストということであいも変わらずPerlを使った。
なんかスミマセン。
特に芸のないコードなので解説なし。
インデントは全角空白になっているので注意。
#! /usr/local/bin/perl
#
# csvConv.pl --- PaSoRiのcsvをマネーフォワード形式に変換

use 5.010;
use strict;
use warnings;
use utf8;
use utf8;
binmode STDIN, ":crlf:encoding(Shift_JIS)";
binmode STDOUT, ":crlf:encoding(Shift_JIS)";

say "計算対象,日付,内容,金額,保有金融機関,大項目,中項目,メモ";

my $dummy = ;
$dummy = ;

while () {
 chomp;
 my ($date, undef, $inRail, $in, undef, $outRail, $out, $money, undef, $memo) = split /,/;
 my $hoyuu = "PASMO";
 $money = $money * (-1);
 my $taishou;
 my $naiyou;
 my $dai;
 my $chuu;
 if ($money == 0) { # 窓出
  next;
 } elsif ($memo eq "オートチャージ") {
  next;
 } elsif ($memo eq "物販") {
  $taishou = "1";
  $naiyou = "PASMO物販";
  $dai = "食費";
  $chuu = "カフェ";
 } else {
  $taishou = "1";
  $naiyou = "PASMO移動 ".$inRail." ".$in."駅〜".$outRail." ".$out."駅";
  $dai = "交通費";
  $chuu = "電車";
 }
 say join ",", $taishou, $date, $naiyou, $money, $hoyuu, $dai, $chuu, $memo;
}
本来はこれをMacのAutomatorに組み込んで披露しようと思ったのだが、なんかこれがものすごくうまくいかないので今回は見送った。