File APIとJavaScriptを使って、テキストファイルを加工する便利ツールを作った
昨日、たまたま仕事で、CSV形式の名簿を加工する必要があって、最近はこういう時、JavaScriptを使って加工することがあります。
昨日の話で言うと、具体的には以下のようなCSVファイルを、
ほげ株式会社,jdg,jdg@example.com 株式会社ふが,taiju,taiju@example.com 有限会社ぴよ,foo,foo@example.com
以下のように加工しなければならないケースでした。
jdg@ほげ株式会社,jdg@example.com taiju@株式会社ふが,taiju@example.com foo@有限会社ぴよ,foo@example.com
「会社名,名前,メールアドレス」で構成されているCSVを「名前@会社名,メールアドレス」で構成したCSVに加工するってことです。
こういう時、今までは、まずはテキストエディタの置換を使って、以下のような配列オブジェクトにして、
[['ほげ株式会社','jdg','jdg@example.com'], ['株式会社ふが','taiju','taiju@example.com'], ['有限会社ぴよ','foo','foo@example.com']]
この配列オブジェクトに対して、コードを書いて加工してました。
[['ほげ株式会社','jdg','jdg@example.com'], ['株式会社ふが','taiju','taiju@example.com'], ['有限会社ぴよ','foo','foo@example.com']] .map(function(n) { return n.map(function(m, i) { return (i == 0) ? n[i+1] + '@' + n[i] : (i == 1) ? undefined : m; }).filter(function(n) { return n }); }).join('\n');
会社のパソコンで実行できるプログラミング言語は、JavaScriptしかないので仕方ないですが、毎回、テキストエディタで配列オブジェクト作るのはめんどいなーと思っていて、昨日もそうせざるを得ませんでした。
それFile APIでできるよ
なんで今まで思いつかなかったのかが悔やまれますが、File APIを使えばテキストファイルを読み込めるということに気づき、帰宅後、もっと汎用的なツールにすべくコーディングしてできたのがこれです。当然、File APIに対応しているFirefox3.6以降でしか使えません。
TextReplacerの説明
本当はCSVファイルを加工するサンプルプログラムを掲載する予定でしたが、任意のコードを受け付けるようにしたらおもしろいかなーと思ってみたりした結果、単純ではありますが、結構便利なツールが出来上がった気がします。
Replacerには任意の関数を受け付けることができますので、先程の例のように、以下を「任意のファイル名.csv」として保存し、Readerで読み込んで、
ほげ株式会社,jdg,jdg@example.com 株式会社ふが,taiju,taiju@example.com 有限会社ぴよ,foo,foo@example.com
以下のコードをReplacerとして、evalすれば、きれいに仕上がった結果がResultに表示されます。(ひとつめのfilterはファイル末尾に空行が入らない場合は不要です)
function(csv) { return csv.split('\n').filter(function(n) { return n }).map(function(n) { return n.split(','); }).map(function(n) { return n.map(function(m, i) { return (i == 0) ? n[i+1] + '@' + n[i] : (i == 1) ? undefined : m; }).filter(function(n) { return n }); }).join('\n'); }
Replacerにはどんな関数でも挿入できるので、function(txt) { return txt.length }
とすれば、文字数(改行コード含む)を調べることができますし、function(txt) { return txt.replace(/hoge/g, 'fuga') }
とすれば、文字列の置換ができます。function(txt) { return txt.split('\n').filter(function(n) { return n }).length }
とすれば行数(空行除く)を調べられます。
以上は単純な例ですが、関数をネストして使ったりすれば、かなり複雑な加工もできると思います。
エラーも吐いてくれるし、とりあえずreturn
さえすれば、加工結果が見れるので、試行錯誤しながらReplacerを作っていけると思います。
File APIについて
File APIはreadline的なメソッドがありませんが、txt.split('\n').map(function(readline) { ... })
とすれば、readline相当のことはできるので、あまり問題に思いません。
ファイルの書き込みはできませんが、テキストファイルだったら、コピペできる状態にできさえすれば、それで十分な気がしますし、何より安全です。
とか言ってたらあった。つFile API: Writer
まとめ
個人的には、初めて自分でも活用しようと思えるツールになりましたw