text+tsvファイルからjsonを生成する

text+tsvファイルからjsonを生成する

私は初心者で、JSonを使ったことがありません。一部のjsonテキストファイルのみを解析しました。
カテゴリ数は異なる場合があります。

Category1
1111|2222|3333|444|5555
6666|7777|8888|9999|1111
0000|1111|22222|3333|4444
Category2
2222|3333||5555
2222|3333|4444||5555
Category3
AAAA|||BBBB
CCCC|DDDD|EEEE|FFFF|GGGG

予想される JSON: カテゴリ ---> 配列 ---> tsv ごとに --> Make Key:Value(Year|Title|Name|Format|Base) tsv の値が上記のいずれかと一致しない場合は、null を追加します。 Jsonは次のようにする必要があります。これは、各カテゴリーを数値的に索引付けし、カテゴリーを再索引付けしてtsv配列を取得できることです。

Json構造は次のようになります。たとえば、次のようになります。

1) I could get list of category using jq
cat file | jq
Output:
Category1
Category2
Category3
2) Index that Category
jq '.| Category[0]'
Output:
Category1
1111|2222|3333|444|5555
6666|7777|8888|9999|1111
0000|1111|22222|3333|4444


3) Index each tsv 
jq Category1 | jq '.[0]' ---> 
{
"Year": "1111"
"Title": "2222"
"Name": "3333"
"Format": "4444"
"Base": "5555"
}

jq'.|カテゴリ[0]

ベストアンサー1

最終的なJSON文書がどのように見えるかはわかりませんが、mlrMiller()と次のようにCSV入力ファイルに基づいてJSON文書を作成しますjq

mlr --c2j -N --ifs pipe --ragged \
        label Year,Title,Name,Format,Base then \
        put '
                if (NF == 1) {
                        @Category = string($Year)
                } else {
                        $Category = @Category
                }' then \
        filter -x 'is_absent($Category)' then \
        unsparsify file.csv |
jq -n 'reduce inputs as $a ({}; .[$a.Category] += [$a])'

これは、質問で述べた順序で言及したタイトルを追加することから始まります。Yearレコードにフィールドが1つしかない場合は、そのフィールド(最初のフィールド)の値を記憶します。Category複数のフィールドがある場合は、記憶された値でフィールドが生成されます。

次に、そのフィールドがないすべてのレコードを削除し、Category最後に欠落しているフィールドにnull値を追加します。

これでJSONオブジェクトセットが作成されました。

{ "Year": 1111, "Title": 2222, "Name": 3333, "Format": 444, "Base": 5555, "Category": "Category1" }
{ "Year": 6666, "Title": 7777, "Name": 8888, "Format": 9999, "Base": 1111, "Category": "Category1" }
{ "Year": 0000, "Title": 1111, "Name": 22222, "Format": 3333, "Base": 4444, "Category": "Category1" }
{ "Year": 2222, "Title": 3333, "Name": "", "Format": 5555, "Base": "", "Category": "Category2" }
{ "Year": 2222, "Title": 3333, "Name": 4444, "Format": "", "Base": 5555, "Category": "Category2" }
{ "Year": "AAAA", "Title": "", "Name": "", "Format": "BBBB", "Base": "", "Category": "Category3" }
{ "Year": "CCCC", "Title": "DDDD", "Name": "EEEE", "Format": "FFFF", "Base": "GGGG", "Category": "Category3" }

jqその後、フィールドの値に基づいてオブジェクトを配列として収集することによって処理されますCategory

データが与えられると、これは何かを生成します等しい

{
   "Category1": [
      { "Base": 5555, "Category": "Category1", "Format": 444, "Name": 3333, "Title": 2222, "Year": 1111 },
      { "Base": 1111, "Category": "Category1", "Format": 9999, "Name": 8888, "Title": 7777, "Year": 6666 },
      { "Base": 4444, "Category": "Category1", "Format": 3333, "Name": 22222, "Title": 1111, "Year": 0 }
   ],
   "Category2": [
      { "Base": "", "Category": "Category2", "Format": 5555, "Name": "", "Title": 3333, "Year": 2222 },
      { "Base": 5555, "Category": "Category2", "Format": "", "Name": 4444, "Title": 3333, "Year": 2222 }
   ],
   "Category3": [
      { "Base": "", "Category": "Category3", "Format": "BBBB", "Name": "", "Title": "", "Year": "AAAA" },
      { "Base": "GGGG", "Category": "Category3", "Format": "FFFF", "Name": "EEEE", "Title": "DDDD", "Year": "CCCC" }
   ]
}

これを通過すると、jq '.Category1[0]'次のようになります。

{
  "Year": 1111,
  "Title": 2222,
  "Name": 3333,
  "Format": 444,
  "Base": 5555,
  "Category": "Category1"
}

おすすめ記事