パソコン用のアプリケーションを作るとき、データを保存するためのファイル形式は柔軟性を考慮して考えておく。XMLかJSONの精神を身につけるべし。
初めてのCの体験が忘れられない人たち
自分でプログラムを書ける人のなかに、データをCSV形式で保存する人がいます。
別に悪いことではありません。テキストファイルを1行ずつ書きだすだけの簡単なプログラムになるので、チャチャっとプログラムを書くなら、そして書式の制約を理解している自分だけが使うのなら、素早くプログラムを書くことができます。
そのため、50歳を超えるノンプロ社内プログラマには、「そこで使うと後々面倒だよぉぉぉ」というところにもCSVを使ってしまう人がいます。そして、呪文のように、”fprintf, fscanf, fgets”を唱えるのです。
しかし、CSV形式はデータの並びが重要で、データ項目を追加しようとすると、プログラムを変更しなくてはなりません。これからプログラムを書く人は、内部構造を持つことができ、データ項目の追加・更新に柔軟な、XMLやJSONを使えるようになっておきましょう。
CSV vs XML, JSON
CSVもXMLもテキストファイルです。メモ帳などのエディタで開いて、読むことができるファイル形式です。
CSVはデータの値を、カンマで区切って並べるだけの形式です。たとえば、
佐藤,21,5
清水,20,15
鈴木,23,4
みたいな感じです。それが何を表しているかは、あらかじめ決めておくわけです。上の例でいえば、バイトの名前と年齢と経験月数、とかね。
もし、電話番号を追加しよう、年齢じゃなく誕生年に変更しようとなれば、データの並びを変えなくてはなりませんから、プログラムも変えなくてはいけないし、データとプログラムはセットですから、プログラムのバージョン管理もしなくてはなりません。プログラムをすでに配布していたりしたら、大変ですよ。
その点、XMLやJSONはデータ項目の追加、変更にはビクともしません。
いや、少しはしますが、データ構造を変更したことで、プログラムを修正する必要性は大幅に低減します。XMLで同じデータを表すと、たとえば、つぎのようになります。ここでは、データ部分だけを示しています。
<person>
<name>佐藤</name>
<age>21</age>
<experience>5</experience>
</person>
<person>
<name>清水</name>
<age>20</age>
<experience>15</experience>
</person>
<person>
<name>鈴木</name>
<age>23</age>
<experience>4</experience>
</person>
おなじものを、JSON形式で記述すると、つぎのようになります。
person={name=”佐藤”, age=21, experience=5}
person={name=”清水”, age=20, experience=15}
person={name=”鈴木”, age=23, experience=4}
いずれも一瞥してデータの意味が分かりますね。
しかも、データの追加は簡単です。
<person>
<name>佐藤</name>
<phone>03-9999-8888</phone>
<age>21</age>
<experience>5</experience>
</person>
person={name=”佐藤”, phone=”03-9999-8888″, age=21, experience=5}
このように値を追加しても、もとのプログラムはそのまま動きます。もちろん、追加したデータを利用するなら、読み込む機能をつけなくてはいけませんが、データの表記が変わっただけでは、元のプログラムは影響を受けません。
いろんなプログラミング言語に便利なライブラリがあります
しかし、こんなゴチャゴチャした文字列を読み込んで、データを切り分けて、数値に変換して。。。
なんてことを考えたらメリットは半減します。
そこで、便利なライブラリを利用しましょう。
XMLにしても、JSONにしても、その書式で書かれた文字列をそっくりそのまま入力すれば、食べやすいように料理してくれるフリーのプログラム(ライブラリ)があります。
つまり、
document = XMLSERVER.read(str);
みないな感じで、XML文字列を保存してあるstrを、ライブラリに放り込んでやれば、
name = document.get(“name”)
みたいな感じで、データを取り出せるのです。XMLSERVERの部分とか関数名とかは、適当に書いています。ライブラリによって使い方は違いますから、使うライブラリのマニュアルを読んでください。
いちおう言い訳をしておくと、実際には、何番目のpersonデータについて、nameを取り出すのかとか、ループ処理で順番に処理するとか、細かいプログラムを書くことになります。
ですから、せっかくXMLを使っていながら、文字列を直接操作してはいけません。
「fgetsで読み込んで、前から読んでいって、</ホニャララ>を見つけたら、そこまでのデータをstrncpyして、atofでぇ。。。」
ピー!退場!