今回は、実用的なプログラムのサンプルとしてCSVデータをTSVデータへ変換するプログラムを開発する。CSVをTSVへ変換するプログラムはメリットが多く、開発の難易度やソースコードのサイズの点でも取り上げやすい題材だ。本格的な開発に取り組むための取っ掛かりとしては、よい課題だと思う。

実用的なプログラムを作っていく

これまでの作業で、WindowsでLLVM Clangを使ったC言語開発ができるようになった。makeも使えるようになったし、これだけでもかなりの規模のソフトウェアを開発していくことができる(それが簡単かどうかは別の話だが、仕組み上は可能になったわけだ)。セットアップした環境はWindows以外のプラットフォームでも利用できるので、Windowsで開発してLinuxへデプロイするといったこともできる。

次は、もっと実用的なプログラムを開発していこう。この手のチュートリアルでは、開発環境の機能を紹介するためにかなり簡単なサンプルソースコード、それこそHello Worldだけで終わってしまうことがある。これでは簡単すぎて、実用的なプロダクトを開発しようとすると、挫折してしまうことがある。よって、最初からある程度本番開発環境に近い環境をセットアップして慣れていくことが大切だ。

CSVをTSVへ変換するプログラムをつくる

ここでは、実用的なプログラムのサンプルとして、CSVデータをTSVデータへ変換するプログラムを開発する。CSVはComma-Separated Values(カンマ区切りの値)のことで、カンマ「,」で区切られたデータ形式のファイルだ。CSVは交換用データ形式として広く普及している。次のようなファイルがCSVファイルに該当する。

CSVファイルのサンプル

13101,100,1000000,トウキョウト,チヨダク,イカニケイサイガナイバアイ
13101,102,1020072,トウキョウト,チヨダク,イイダバシ
13101,102,1020082,トウキョウト,チヨダク,イチバンチョウ
13101,101,1010032,トウキョウト,チヨダク,イワモトチョウ
13101,101,1010047,トウキョウト,チヨダク,ウチカンダ
13101,100,1000011,トウキョウト,チヨダク,ウチサイワイチョウ
13101,100,1000004,トウキョウト,チヨダク,オオテマチ(ツギノビルヲノゾク)
13101,100,1006890,トウキョウト,チヨダク,オオテマチジェイエイビル(チカイ・カイソウフメイ)
13101,100,1006801,トウキョウト,チヨダク,オオテマチジェイエイビル(1カイ)
13101,100,1006802,トウキョウト,チヨダク,オオテマチジェイエイビル(2カイ)

現実では、CSVフォーマットの互換性は実装に依存するところがあるが、CSVのフォーマットについてはRFC 4180に説明がまとまっているので、これに準拠した実装を行うものとする。

TSVはTab-Separated Values(タブ区切りの値)のことで、CSVの区切りがカンマから「タブ」に替わったものだと考えるとわかりやすい。

TSVファイルのサンプル

13101   100 1000000 トウキョウト  チヨダク イカニケイサイガナイバアイ
13101   102 1020072 トウキョウト  チヨダク イイダバシ
13101   102 1020082 トウキョウト  チヨダク イチバンチョウ
13101   101 1010032 トウキョウト  チヨダク イワモトチョウ
13101   101 1010047 トウキョウト  チヨダク ウチカンダ
13101   100 1000011 トウキョウト  チヨダク ウチサイワイチョウ
13101   100 1000004 トウキョウト  チヨダク オオテマチ(ツギノビルヲノゾク)
13101   100 1006890 トウキョウト  チヨダク オオテマチジェイエイビル(チカイ・カイソウフメイ)
13101   100 1006801 トウキョウト  チヨダク オオテマチジェイエイビル(1カイ)
13101   100 1006802 トウキョウト  チヨダク オオテマチジェイエイビル(2カイ)

TSVファイルはRFCに定義されていない。MIME typeを説明した次の文章が参考になるだろう。

カンマをタブに入れ替えるだけと思うかもしれないが、TSVはCSVよりもルールが簡単だ。CSVではカンマをデータに含めることができるといったように「クォート」処理が入るのだが、TSVにはそうしたことがない。TSVではタブは区切り文字であり、これをデータに含めることはできないのだ。その代わりフォーマットはシンプルで、実装も簡単にできる。

交換用データ形式にはCSVが使われることが多いが、アプリケーション間でドラッグ&ドロップするデータとしてはTSVのほうが便利なことが多い。そのままスプレッドシートアプリケーションに貼り付けて利用できるほか、処理を書く場合もTSVのほうが実装が簡単になるのだ。

CSVフォーマット

先ほども説明したように、CSVフォーマットは次のドキュメントに仕様がまとまってる。

カンマ区切りだけなら簡単なのだが、CSVではカンマをデータにすることができ、そのためにクォート規則が用意されている。ダブルクォーテーションで囲むとカンマをデータにできるというものだ。そうなると、今度はダブルクォーテーションの中のブルクォーテーションはどうやってクォートするのか、ということになる。

仕様を要点に絞ってまとめると、次のようになる。

  • レコード:複数のフィールドから構成される行。フィールドは「,」で区切られる。レコード(行)の終わりはCRLF
  • フィールド:データに「カンマ」、「ダブルクォーテーション」、「改行」を含む場合はダブルクォーテーションで囲む必要がある。データとしてのダブルクォーテーションは必ず「""」とする必要がある

CSVフォーマットの処理は実装系に依存していることが多いので、上記のように処理されないもの、さらにルールが異なるものもある。その辺りは必要に応じて実装してもらうとして、ここでは上記ルールを基本的なフォーマットと考えることにする。