ネストしたデータも表現できるCSV

一般的なCSVはネストしたデータをうまく表現できません。

そこでネストしたデータを自然に表現できるようにCSVを拡張したデータ形式を考えました。

このデータ形式をCSVO(CSV for Object)と仮に名付けます。

概要を見ていきましょう。

ヘッダ

CSVではヘッダは必須ではありません。

ヘッダがある場合は1行目がヘッダであり、2行目からデータがはじまります。

こんな感じですね。
(※以降のサンプルでは見やすいように適宜空白を入れています。)

K1,   K2,   K3
R1V1, R1V2, R1V3
R2V1, R2V2, R2V3

1行目はヘッダ行です。

このデータをJSONで表すと以下のようになります。

[
    {"K1": "R1V1", "K2": "R1V2", "K3": "R1V3"},
    {"K1": "R2V1", "K2": "R2V2", "K3": "R2V3"}
]

このデータをCSVOでは以下のように書きます。

K1,   K2,   K3

R1V1, R1V2, R1V3
R2V1, R2V2, R2V3

CSVOではヘッダとデータの間には空行をはさみます。

あるいはカンマなどの区切り文字は残っていてもよいでしょう。

K1,   K2,   K3
,,
R1V1, R1V2, R1V3
R2V1, R2V2, R2V3

そしてヘッダは複数行になることができます。

そのことでネストが表現できるようになります。

ネストの表現

こんなデータから始めましょう。

K1, K2

V1, V2

JSONで表すとこうですね。
(以降ではすべてのサンプルにそのデータのJSON表現をつけます。)

[
    {
        "K1": "V1",
        "K2": "V2"
    }
]

K2をネストさせてみましょう。

ネストが始まったらヘッダ行を増やして次の行に移動します。

K1, K2  ,
,   K2-1, K2-2

V1, V2-1, V2-2
[
    {
        "K1": "V1",
        "K2": {
            "K2-1": "V2-1",
            "K2-2": "V2-2",
        }
    }
]

ネストが終わったら元の行に戻ります。

K1, K2  ,     , K3 
  , K2-1, K2-2,

V1, V2-1, V2-2, V3
[
    {
        "K1": "V1",
        "K2": {
            "K2-1": "V2-1",
            "K2-2": "V2-2",
        },
        "K3": "V3"
    }
]

配列の表現

配列も表現できるようにしましょう。

配列は「*」をキーの代わりに使います。

*,  *,  *

V1, V2, V3
[
    ["V1", "V2", "V3"]
]

こちらもネストできます。

K1  ,     ,     ,
*   ,     , *   ,
K1-1, K1-2, K1-1, K1-2

V1  , V2  , V3  , V4
[
    {
        "K1": [
            {"K1-1": "V1", "K1-2": "V2"},
            {"K1-1": "V3", "K1-2": "V4"}
        ]
    }
]

これでいろんなデータが表現できますね。