2016-09-15 4 views
0

jsonファイル 'OpenEnded_mscoco_val2014.json'があります.Jsonファイルには121,512個の質問が含まれています。ここ
は、いくつかのサンプルです:特定の制約に基づいてjqを使用してjsonを変換する

"questions": [ 
{ 
    "question": "What is the table made of?", 
    "image_id": 350623, 
    "question_id": 3506232 
}, 
{ 
    "question": "Is the food napping on the table?", 
    "image_id": 350623, 
    "question_id": 3506230 
}, 
{ 
    "question": "What has been upcycled to make lights?", 
    "image_id": 350623, 
    "question_id": 3506231 
}, 
{ 
    "question": "Is this an Spanish town?", 
    "image_id": 8647, 
    "question_id": 86472 
} 

]

私はcsvファイルにJSONに変換するためにjq -r '.questions | [map(.question), map(.image_id), map(.question_id)] | @csv' OpenEnded_mscoco_val2014_questions.json >> temp.csvを使用しました。
しかし、ここではcsvでの出力は質問の後にimage_idが続きます。これは上記のコードが行うことです。
予想される出力は次のようになります。

"What is table made of",350623,3506232 
"Is the food napping on the table?",350623,3506230 

また、それはimage_id <= 10000group questions having same image_idにした結果のみをフィルタリングすることは可能でしょうか?例えばjsonの1,2,3の結果は、1つのimage_id、3 question_idの3つの質問を組み合わせることができます。

編集:最初の問題はpossible duplicate questionによって解決されます.jsonファイルを変換するためにjqのコマンドラインで比較演算子を呼び出すことができるかどうかを知りたいですか?この場合、image_id <= 10000の場合のみjsonからすべてのフィールドを取得します。

+0

あなたの最初の質問は何ですか? – JosephGarrone

+0

[jqを使って任意の単純なJSONをCSVに変換するにはどうすればいいですか?](http://stackoverflow.com/questions/32960857/how-to-convert-arbirtrary-simple-json-to-csv-using-jq) –

+0

json_load()を使用して比較すると大量のメモリが必要になるので、ファイルのサイズが大きすぎるため、jqを使用して値<= 10000のimage_idを持つ出力をフィルタ処理したいとします。 – SupposeXYZ

答えて

1

1)(適切に)それが有効なJSONにする工夫示すように、次のクエリは、CSV出力を生成し、あなたの入力を考える:

$ jq -r '.questions[] | [.question, .image_id, .question_id] | @csv' 

"What is the table made of?",350623,3506232 
"Is the food napping on the table?",350623,3506230 
"What has been upcycled to make lights?",350623,3506231 
"Is this an Spanish town?",8647,86472 

ここで覚えておくべき重要なことは、@csvはフラット配列を必要とすることですすべてのjqフィルタと同じように、ストリームにフィードできます。

.questions[] 
| select(.image_id <= 10000) 
| [.question, .image_id, .question_id] 
| @csv 

3)image_idは並べ替えるために、使用sort_by(.image_id)

.questions 
| sort_by(.image_id) 
|.[] 
| [.question, .image_id, .question_id] 
| @csv 

4):を基準.image_id <= 10000を使用してフィルタする

2)は、単に適切なselect/1フィルタを挟みますグループ.image_idによって、次のパイプラインの出力を独自のパイプラインにパイプします。

.questions | group_by(.image_id) 

ただし、グループ化されたオブジェクトをどのように組み合わせるかを正確に決定する必要があります。 -rオプションで

+0

2番目の答えは.question | select(.image_id <= 10000)| [.question、.image_id、.question_id]と書くことができます。それが制約付きの出力を返すように@ csv? – SupposeXYZ

+0

(2)では、指定されたフィルタDOESが制約付き出力を出力します。あなたはそれを試しましたか? – peak

+0

こんにちは@peak、それはすべて働いてくれてありがとう! JSONデータから特定の質問タイプを抽出することは可能ですか?「How」、「What is」などで始まる質問だけを望みます.json.load()を使用します。 – SupposeXYZ

0

、次のフィルタは

.questions[] | [ .[] ] | @csv 

"What is the table made of?",350623,3506232 
"Is the food napping on the table?",350623,3506230 
"What has been upcycled to make lights?",350623,3506231 
"Is this an Spanish town?",8647,86472 

は、データをフィルタを選択を使用するために生成します。例えば。 -rオプションで次のフィルタ

.questions[] | select(.image_id <= 10000) | [ .[] ] | @csv 

データがGROUP_BYを使用するグループにサブセット

"Is this an Spanish town?",8647,86472 

を生成します。次のフィルタ

.questions 
    | group_by(.image_id)[] 
    | [ .[] | [ .[] ] | @csv ] 

[ 
    "\"Is this an Spanish town?\",8647,86472" 
] 
[ 
    "\"What is the table made of?\",350623,3506232", 
    "\"Is the food napping on the table?\",350623,3506230", 
    "\"What has been upcycled to make lights?\",350623,3506231" 
] 

グループ化されたデータを生成これは、この形式では非常に有用ではありませんし、正確に何をしたい、おそらくではありませんが、基本的なアプローチを示しています。

関連する問題