戻る

CSVを活用しよう

TSV と CSV の相互変換

最近は、 タブ区切りテキスト (tab separated value; TSV) よりもコンマ区切りテキスト (comma separated value; CSV) の方がよく使われているようです。 awk が扱うのは TSV (とは少し違うのかな? 空白も区切りになるので) なので、 表計算ソフトウェアより awk スクリプトで計算したい私のような人間にとってはあまり面白くありません。 もし、 CSV のどのフィールドにも `,' や改行が含まれないなら、 awk スクリプトの BEGIN ブロック中で FS="," とすればよいだけなのですが、 含まれたとたんに事態は複雑になります。 (そもそも CSV の仕様が複雑すぎるのが問題なのだ) そして、改行はともかく `,' を使いたい場面は結構あるのです。

CSV を TSV に変換する awk 関数が書けることは知っていますが、 結構複雑で遅いですし、全てのスクリプトに組み込むのも大変です。 そこで、かんたんな sed スクリプトを書いてみました (おそらくは百回目くらいの車輪の再発明なのでしょうけれど)。

なお、 TSV や CSV の仕様自体があまりはっきりしていないわけですが、 ここでは以下のようなものであるとします。

  1. TSV
  2. CSV
  3. 共通事項

以下にスクリプトを置いておきます。

表計算ソフトウェア sc で CSV を編集する

データ互換性を考えるとデータは CSV でもっていたいのですが、 `"' による「囲み」を多用した CSV は可読性が低く、 エディタで直接かきたくはありません。 Windows ユーザなら Excel を使うのでしょうけれど、 表計算ソフトウェア(スプレッドシート)は Unix 系 OS の弱点とされる分野のひとつです (もっとも、 awk があればそんなものはいらない、というのも「正論」ではあります。 私も awk + TSV + Emacs で特に不満はありませんでした)。 最近は Unix 系 OS でも、 Gnome や KDE などのデスクトップ環境上で動く Excel 互換スプレッドシート (しかもフリーソフトウェア) がいくつかあらわれています。 でも、Excel 互換スプレッドシートはやはり「Excel 互換」に「重い」のでした。 「軽い道具を組み合わせて快適に使う」ことに慣れた Unix ユーザとしては、 とても常用する気にはなれません。 ということで、ちょっと工夫してみることにしました。

歴史ある CUI スプレッドシートに sc というのがあります。 これで CSV を編集する wrapper を書いてみました。

三つのスクリプトをパスの通ったディレクトリに置いて sccsv hogehoge.csv のようにします。 フィールド中のタブと改行は sc では `\t'`\n' とエスケープされます。 フィールド中に `,' があっても大丈夫です。 正規表現 (19|20)?[0-9][0-9]/(0?[1-9]|1[012])/(0?[1-9]|[12][0-9]|3[01]) と一致する CSV のフィールドは日付として扱われます。

Web ブラウザで CSV にデータを追加する

Web ページのフォームから CSV にデータを追加できると便利なことも多いでしょう。 そのための CGI スクリプトとしては、例えばすでに CSVForm という Perl スクリプトが存在します。 しかし、このソフトウェアの以下の特徴が私には気に入りませんでした。

そこで (Perl スクリプトは書けないので) Ruby で類似 CGI をつくってみました。

フォームから

というデータが送られると、 /home/someone/csv/phone.csv に

のように追記して、 http://some.domain/index.html に移動します。


重藤 知夫