jq

2015-08-24 5 views
9

के साथ विशाल जेसन-सरणी फ़ाइलों को प्रोसेस करना मेरे पास अपेक्षाकृत छोटी वस्तुओं की विशाल (~ 7 जीबी) जेसन सरणी है।jq

क्या पूरे ऑब्जेक्ट को स्मृति में लोड किए बिना इन वस्तुओं को फ़िल्टर करने का अपेक्षाकृत सरल तरीका है?

- स्ट्रीम विकल्प उपयुक्त दिखता है, लेकिन मैं यह नहीं समझ सकता कि मूल वस्तुओं में [पथ, मूल्य] की धारा को कैसे फोल्ड करना है।

+0

छोटे दुनिया यहाँ पत्रक की एक धारा का उत्पादन करने का तरीका बताया। मैं अभी भी इसी तरह की समस्या के खिलाफ आया हूं। ब्याज से, क्या आपकी जेसन फ़ाइल में व्हाइटस्पेस अनुमानित है? उदाहरण के लिए, बड़े जेसन सरणी अक्सर प्रति पंक्ति स्तर सरणी आइटम एक पंक्ति का उपयोग करते हैं? – Tom

+0

यदि फ़ाइल पहले से ही नियमित रूप से स्वरूपित है, तो हो सकता है कि आप फ़ाइल को छोटी वस्तुओं की धारा में परिवर्तित करने के लिए टेक्स्ट-wrangling टूल का उपयोग करने पर विचार करना चाहें, जिसे बाद में jq का उपयोग करके संसाधित किया जा सकता है। अगर फ़ाइल पहले से ही उपयुक्त रूप से स्वरूपित नहीं है, तो अगर पूरी फ़ाइल पर सिर्फ एक बार jq का उपयोग करने के लिए स्वीकार्य है, तो आप JSON को प्रारूपित करने के लिए 'jq।' का उपयोग करने पर विचार कर सकते हैं ताकि इस तरह की स्ट्रीम में कनवर्ट करना आसान हो। – peak

उत्तर

5

jq 1.5 में एक स्ट्रीमिंग पार्सर है। JQ FAQ कैसे JSON के एक उच्च-स्तरीय सरणी उसके तत्वों की एक धारा में वस्तुओं को परिवर्तित करने का एक उदाहरण देता है:

$ jq -nc --stream 'fromstream(1|truncate_stream(inputs))' 
[{foo:"bar"},{foo:"baz"}] 
{"foo":"bar"} 
{"foo":"baz"} 

अपने उद्देश्यों के लिए पर्याप्त हो सकता है, लेकिन यह है कि setpath/2 पर ध्यान देना उपयुक्त है सकते हैं सहायक बनें।

jq -c --stream '. as $in | select(length == 2) | {}|setpath($in[0]; $in[1])' 

अधिक जानकारी और प्रलेखन JQ के मैनुअल में उपलब्ध है:: https://stedolan.github.io/jq/manual/#Streaming

+0

'- स्ट्रीम' विकल्प आशाजनक दिखता है, हालांकि मुझे अभी भी यह सुनिश्चित नहीं है कि इसका उपयोग कैसे किया जाए। उदाहरण के लिए, स्ट्रीमिंग पार्सर अंत में एक लापता समापन ब्रैकेट का पता कैसे लगाएगा? – hek2mgl

+0

धन्यवाद, ऐसा लगता है कि यह मेरी समस्या को हल करने का इरादा तरीका है। दुर्भाग्यवश जेक की तरह दिखता है [बग] (https://github.com/stedolan/jq/issues/927) जो मुझे इसका उपयोग करने से रोकता है। मैं अपने छोटे जेसन पार्सर लिखने के साथ समाप्त हुआ जो एक ही काम करता था। यह भी पाया गया कि मेरी सरल पायथन लिपि जो दिलचस्प प्रविष्टियों को पकड़ती है jq से तेज़ी से काम करती है (क्या मैं अनुचित रूप से jq का उपयोग कर सकता हूं)। तो मैं इस उपकरण में काफी निराश हूं :( –

+0

@ dim-an - इनपुट के उपयोग के दौरान आवश्यक होने के बारे में मेरा बुरा। - स्ट्रीम विकल्प नया है इसलिए मुझे आश्चर्य नहीं है कि यह काफी धीमा है। इस पृष्ठ पर कहीं और उल्लेख किया गया है, अगर मैं आपकी स्थिति में था (जैसा कि वास्तव में मैं किया गया है), तो शायद मैंने पहले और आखिरी ब्रैकेट को आसानी से फिसल दिया होगा, या यह समझने पर ध्यान केंद्रित किया होगा कि एक बार अपने विशाल एक वस्तु को झुकाव के लिए jq का उपयोग कैसे करें JSON एक अधिक प्रबंधनीय रूप में। – peak

संबंधित मुद्दे