Column (No. 4)

[付録] csvとjson

 csvファイルは幅広く利用されている電子データの形式です。csv(Comma-Separated Values)は、テキストベースの形式で、表形式のデータを表現するのに便利です。以下の様に長所も短所もあります。

  • シンプルな形式
    csvは通常使っている文字が並んでいるだけと言う非常にシンプルな形式であり、テキストエディタやExcel等の表計算ソフトなど、さまざまなツールで簡単に作成および編集することができます
  • それなりの柔軟性
    さまざまなデータ形式を格納できるため、さまざまな用途に適しています。テキスト、数値、日付、時間など、文字になるものは何でもデータを含むことができます。論理値など文字ではないものも、例えば”有”と”無”などの文字で代替えする事で使う事ができます。但し、複数の値を持つデータや構造を持つデータの表現は別の取り決めが必要です。例えば、「人」に対する属性として「あだ名」を考えると複数のあだ名があるの人がいますが、この幾つあるか分からない情報を表現する場合には工夫が必要です。また、住所の様に都道府県・市区町村・町字・それ以下などの構造を持つ場合は項目を分けるかまとめて一つの項目に押し込む必要があります。
  • それなりの相互運用性
    csvファイルは、異なるシステムやプラットフォーム間でデータを共有するための標準的な手段として広く使用されています。多くのソフトウェアやプログラミング言語は、csvファイルを読み書きするためのライブラリや機能を提供しています。但し、登録されている値が数値なのか文字列なのかは指定で決まません。例えば、”0123″は数値の123なのか0123という文字列なのかを区別する事が出来ませんし、”24-03-15″は日付の2024年3月15日なのか、単なる文字列なのかも区別がつきません。
  • コードが多様
    コードにはUNICODE以外も多様なコードの利用が可能です。これは利点であると同時にデータを交換する時には必ずコードを取り決める必要があるという欠点でもあります
  • Excel等の表計算ソフトとの親和性
    表計算ソフトは二次元の表の形式なので、表計算ソフトと親和性が高く、表計算ソフトを使ってグラフを作るなどが可能です。但し、前記の様にcsvでは数字で出来ている文字列が数値なのか文字列なのかを区別する事が出来ませんので、表計算ソフトで読み込むと先頭のゼロ(“0”)が勝手に削除されてしまったりします
  • 仕様変更に弱い
    csvは項目を追加した場合の考え方を規定していません。例えば項目が増えた場合、項目の位置がずれてしまいますが、情報の受け手は項目名で処理していれば良いのですが、項目の番号で処理していると不具合が発生します
  • 一括でのデータ交換に向く
    csvは複数の行を一括して受け渡すのに向いています。逆に言うと、リアルタイムに一件ずつの行をやり取りするには(出来ない事はありませんが)面倒です
  • ファイル数が多くなる傾向
    既に記述した様にcsvは複数の値を持つ情報を表現しにくいです。これを打破するには、複数の値を持つ情報を別のcsvファイルに格納する方法がありますが、csv自体は複数のファイルを一括して取り扱う標準ではありませんので、結果的にファイル数が増える傾向があります。逆にファイル数を少なくしようとすると、表現できる情報が限定されます

 これに対し、jsonはインタネット上で情報をやりとりするために生まれましたので、csvの欠点を補うような特性があります。尚、jsonの例については、本サイトの「共通データ仕様の基礎知識」をご覧ください

  • シンプルな形式
    jsonはcsv同様に通常使っている文字が並んでいるだけと言う非常にシンプルな形式であり、テキストエディタなど、さまざまなツールで簡単に作成および編集することができます。自由な表現を可能とするデータの形式としてはXML (eXtensible Markup Language) が有名ですが、XMLは複雑で文字数が多くなる傾向があり、jsonは簡略化・軽量化したものも言えます
  • 柔軟性
    さまざまなデータ形式を格納できるため、さまざまな用途に適しています。テキスト、数値、日付、時間など、文字になるものだけでなく、複数の値を持つデータや構造を持つデータの表現も規定さています。また、論理値もそのまま格納できます。例えば幾つあるか分からない情報としては、「人」に対する属性として「あだ名」を考えると複数のあだ名があるの人がいますが、このを表現する場合の表現方法も規定されています。また、構造がある情報としては住所の様に都道府県・市区町村・町字・それ以下などの構造を持つ場合がありますが、住所というひとつの項目の中に複数の項目を定義して、それぞれ都道府県・市区町村・町字・それ以下をそれぞれ表現する事もできます
  • それなりの相互運用性
    異なるシステムやプラットフォーム間でデータを交換するための標準的な手段として広く使用されています。特にインタネット上で交換する手段としてはかなり幅広く使われています。csvファイル程ではありませんが、多くのソフトウェアやプログラミング言語は、jsonファイルを読み書きするためのライブラリや機能を提供しています。また、数字と文字列は明確に分けているので、0123が数値なのか文字列なのか迷う事はありません
  • コードが一つ
    コードにはUNICODEのutf-8を使います。このためコードを個々に取り決める必要はありません。この特性は、インタネットでのデータのやり取り、つまり相手が不特定多数という生い立ちに起因します。余談ですが、utf-8には本来BOMはありません。一部ソフトウェアではutf-8でもBOMを付ける場合があるので注意が必要です
  • Excel等の表計算ソフトには変換ソフトでcsvに変換
    表計算ソフトは二次元の表の形式である一方、jsonは非常に自由な表現を可能にしているので一般的にはcsvからjsonへの変換は可能である一方、jsonからcsvへの変換は出来ません。但し、本協議会の共通データ仕様は出来る限り二次元の範疇で定義しているので、変換は多くの項目で可能です。変換についてはケーススタディで例示しています
  • 仕様変更に強い
    csvでは一行目に項目名を記述ししますので、運用途中に項目を追加する場合は過去にさかのぼって項目を追加しなおす必要があります。これに対しjsonは、各データ全てに項目名が埋め込まれていますから、運用途中に項目を追加しても過去のデータを気にする必要はありません。また、jsonは項目に順番はありませんし、情報を受け取った側は知らない項目は無視するという規定もありますので、仕様が多少異なっても情報のやり取りが可能です。この特性はインタネットの様な事前に調整が難しい環境では重要な特徴です
  • 一件毎のデータ交換に向く
    csvは複数の行を一括して受け渡すのに向いていましたが、jsonは一件いっけんのデータをリアルタイムに受け渡すのに向いています。このため、スマホのアプリなど、細かなデータを多数回やりとりする処理に向いています
  • ファイルがまとめられる
    既に記述した様にjsonは複数の値がある情報も表現可能です。csvでこれらに対応するためにはファイルを分ける必要があるためファイル数が多くなってしまったり、ファイル間の整合を保持する事が困難でした。jsonはこの様な事が起きないため、ファイル数が増えてしまう事を避ける事ができます

以上の事から、以下の事が言えます。

  • csv
    データの送り手と受け手が一対一で事前に調整のうえ、必要なデータをひとまとめにして受け渡す局面に向いている。対象のプログラムは表計算ソフトやRDBMSなど
  • json
    不特定多数の参加者間で、一件ずつや多件数まとめて自在にやり取りする処理に向いている。対象のプログラムは、スマホやPCのアプリ、自動制御、スマートシティなど

[付録] csvによるデータの受け渡し

 csvは表形式であり、データの一行を見るとひとつの項目にひとつの文字列(数字や文字の並びのこと)が対応しています。これに対して、一般的なデータモデルでは文字列だけでなく色々な値を定義しています。例えば数値、論理値も登録可能であったり、複数の数値や文字列を登録可能であったりします。そこで、csvを使ってデータを受け渡す際には、幾つかの対策が必要となります。

■値が複数ある項目を別csvにする
 データベース(RDB, 関係データベース)を習ったことがある人には「第一正規化」と言った方が分かりやすいかも知れません。複数の値を持つ項目があれば、値毎にバラバラにして、別のcsvにします。新たに作ったcsvでは、値毎に行が作られます。

 例えば、社員の情報が以下の様になっていたとします。

社員氏名社員番号あだ名
鈴木太郎001すずちゃん、たろちゃん
佐藤花子002はなちゃん、はなぴー

これをjson(NGSI v2ではありません)で表現すると以下の様になります。形式は違いますが、XMLなどでも同様にひとつのファイルで表現できます。

[
   {
      "社員氏名": "鈴木太郎",
      "社員番号": "001",
      "あだな": ["すずちゃん", "たろちゃん"]
   },
   {
      "社員氏名": "佐藤花子",
      "社員番号": "002",
      "あだな": ["はなちゃん", "はなぴー"]
   }
]

これをcsvで表現すると、以下の様に二つのファイルに分かれます。

社員氏名社員番号
鈴木太郎001
佐藤花子002
社員番号あだな
001すずちゃん
001たろちゃん
002はなちゃん
002はなぴー

 この様に、値が複数ある項目が分離され、新たなcsvになります。この際、元のcsvには行を一意に識別する項目が必要で、その項目の値は分離したcsvにもある必要があります。この例では、社員番号がその項目に相当します。

 例えば共通データ仕様の「建物(Building)」では、値が複数ある項目(typeがArrayの項目)は14個ありますから、単純にcsvで表現する15個のcsvファイルが出来ると共に、一意に識別する項目が無い場合はその様な項目を新たに追加する必要があります。

 一般的に、以下の様な対策を取ります。

  • csv化する項目を減らす
    これが最も多用される方法です。つまり、提供する情報を取捨選択する方法ですね。
  • 複数ある値を代表的なもの一つに絞り込む
    例えば、自治体オープンデータセットの「公共施設一覧」で「名称_通称」の項目は一つしか登録できない仕様になっています。同様に大規模の施設であれば、複数の住所や複数の方書があり得ますが、ひとつしか登録できない仕様になっています。自治体オープンデータセットは決してcsvだけに絞ったものではないと思いますが、csvが跋扈している現状を踏まえ、仕様を縮退させたものとなったのではないかと思われます
  • 元のcsvの項目群を分離したcsvに入れ込む
    上の例では、分離したcsvにも「社員氏名」を追加しておけば、元のcsvは不要となります。但し、追加する項目が多い場合にはファイルサイズが多くなったり、データを修正する際に修正漏れが発生したりしますので、運用を十分考える必要があります。また、共通データ仕様の「建物(Building)」の場合は15のcsvが14に減るだけですから、余り効果は無いと考えられます。尚、複数の値を持つ項目の中に更に複数の項目がある場合、例えば「建物(Building)」のZonesの様な場合は末端の項目(ループの一番内側の項目)をcsvの1行に変換し、途中の項目(末端のループではない項目)を各行に入れ込む方法は良く採用されます

■値の形式

 jsonは論理値や数値が表現できますが、csvは全て文字列として表現します。従って、論理値の場合はcsvでは例えば”有”と”無”で表現するなどの工夫が必要です。また、数字からなる文字列をcsvで登録すると、表計算ソフトによっては数値と理解してしまい、先頭にゼロ(“0”)がある場合にはそのゼロが削除されてしまう場合があります。同様にGIFでは年月日は”2024-05-23″の様に表現しますが、これを表計算ソフトで読み込むとソフトによっては勝手に”2024/5/23″等に書き換えられてしますので、注意が必要です。

■値が無い項目

 jsonでは項目を省略する事が可能ですが、csvでは表形式のため省略する事が出来ず、例えば文字数がゼロの文字列(“”)や”無し”などと表現します。この点について気を付ける必要があります。