データ

CSV、JSON、YAML

世界の構造化データの大半は、3つの形式で運ばれています。これらの間の変換は簡単ですが、何かをこっそり壊さずに変換するには、少し注意が必要です。

公開日:

それぞれの用途

CSVは表です。行と列だけで、ほかには何もありません。誰でも読め、非常に小さく、入れ子のものは何も表現できません。JSONは木構造で、配列の中のオブジェクトの中のオブジェクト、というように入れ子になり、ほぼすべてのWeb APIが使う形式です。YAMLはJSONと同じ構造を、波括弧ではなくインデントで表現します。人間にとってはるかに読みやすく編集しやすいため、設定ファイルがYAMLに移ってきました。

型変換の落とし穴

これが、実際に人々に損害を与えるものです。CSVにはテキストしか含まれず、値が数値なのか日付なのか文字列なのかを示す方法がありません。そのため、変換ツールは推測し、その推測はしばしば間違います。

  • 01234のような郵便番号が数値の1234になり、先頭のゼロが失われます。
  • 1-2のような商品コードが日付になります。
  • 長い口座番号が浮動小数点数になり、下の桁が失われます。
  • 北米を意味するNAが、「not available(利用不可)」になります。

これらはどれも、気づかないうちに起こります。そのため、注意深いCSVからJSONへの変換では、すべての値を文字列のままにして、判断をあなたに任せるべきです。このサイトの変換ツールは、最初は細かすぎるように見えても、意図的にそうしています。

CSVへの変換で失われるもの

入れ子です。平らなオブジェクトのJSON配列は、きれいな表になります。値自体がオブジェクトや配列になった途端、それを入れる列がなくなります。選択肢は、複合キーで平坦化する、入れ子の部分をテキストに戻してセルの中に入れる、捨てる、の3つで、黙って捨てるのが最悪です。JSONのテキストとしてセルの中に書き戻せば、少なくともデータは復元できる状態で残ります。

YAMLの落とし穴

YAMLは読みやすい反面、間違いやすい形式です。

  • インデントが構造です。タブは使えません。位置のずれたスペースは、エラーにならずに意味を変えてしまいます。
  • 引用符のない一部の単語は真偽値です。古いYAMLでは、y、n、on、off、yes、noがすべてtrueまたはfalseとして解釈されます。そのため、ノルウェーを表すNOを含む国の列はfalseになります。引用符で囲んでください。
  • JSONへの変換でコメントは消えます。JSONにはコメントを表現する方法がないためです。

往復変換で元に戻る保証はありません

JSONをYAMLに変換して戻すと、たいてい元と同じものが得られます。CSVをJSONに変換して戻すと、たいていは得られません。引用符の流儀、形が異なるレコードの列の順序、空の値の表現はすべて選択の問題で、ツールによって選択が異なります。往復変換が正確である必要がある場合は、思い込まずに確認してください。

相互に変換するには:CSVをJSONに変換、JSONをCSVに変換、またはJSONをYAMLに変換します。往復変換は常に正確とは限らないので、結果を確認してください。