あと味

たくさん情報を食べて、たくさん発信すると、あとになって味わい深い。

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

TextReplacerは単体のHTMLファイルなので、どうぞご自由にダウンロードして使ってください。

TextReplacer.html 直

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