コンマ区切りのデータ

データの項目間がコンマでくぎられたテキストファイルは、 CSV (comma-separated value)形式とも呼ばれ、 違うソフトウェア間のデータの受け渡しによく使われます。

awkでは、次のように、field separatorとしてコンマを設定すれば、 このようなデータを各項目別に読みこむことができます。

BEGIN { FS = "," }

ただし、これは、 データ自体にコンマが含まれていないことを前提としています。

データをCSV形式で書き出すソフトウェアは、 文字列を引用符でくくって書き出し、 引用符の中にあるコンマは、区切りではなくて文字列の一部として扱う 機能をもっているのがふつうです。 しかし、awkはそのような機能に対応しておらず、 読む際に引用符の処理はFSの処理のあとになります。 したがって、文字列の中のコンマも、データではなく項目の区切りと みなされてしまいます。

内容にコンマを含むデータを扱うには、 FSをあてにせずに、行全体を $0として扱い、 引用符を先に、コンマをあとに解釈するプログラムを書くしかなさそうです。 その例文readcsv1.awkを作ってみました。 例文では、各項目をfieldという配列に入れたうえで、 その内容をひとつずつ書き出しています。 実際には、書き出しの部分をデータを使う処理に変えます。 この部分を変えるだけで、多くのデータに対応することができました。

データ内容にコンマを含んでいても引用符でくくられていれば対応できますが、 データ内容に引用符を含んでいる場合の処理は、まだよく確かめていません。

また [わたしは2009年になって気づいたことですが、おそらく前から]、 表計算ソフトウェアではセルの内容の中に改行コードを含むことができ、 これをCSVで書き出したとき改行コードがテキストファイルの改行と みなされることがあります。 そうすると、わたしのプログラムによる行の数えかたや行の中の項目の数えかたは、 表計算ソフトウェアでのものとくいちがってしまいます。 そのような場合には、あらかじめ表計算ソフトウェア側で改行コードを ほかの文字に変えておくことをお勧めしたいと思います。


2002-04-08; 更新 2009-02-14
増田 耕一 (MASUDA Kooiti)

[awkの教材一覧へ]