आँकड़ों और विज्ञापन के लिए कुकीज़
हम आँकड़ों और विज्ञापन के लिए कुकीज़ इस्तेमाल करते हैं, दोनों Google को जाती हैं। मना करने से आपको दिखने वाली किसी चीज़ में कोई फ़र्क़ नहीं पड़ता।निजता पेज पढ़ें
यहाँ आप XML को NDJSON में बदलते हैं, मुफ़्त और बिना खाते के: फ़ाइल ऊपर छोड़िए और कुछ ही सेकंड में नतीजा डाउनलोड के लिए तैयार मिलेगा। कन्वर्ज़न आपके अपने ब्राउज़र के भीतर होता है, इसलिए फ़ाइल कभी अपलोड नहीं होती। यह Windows, macOS और Linux पर वैसे ही चलता है जैसे iPhone और Android पर, और कनेक्शन काट देने पर भी चलता रहता है।
एक बार में 100 फ़ाइलें। फ़ॉर्मेट अलग-अलग हों तो भी चलेगा।
ये एक के बाद एक बदलती हैं और साथ में एक ZIP बनकर उतरती हैं।
XML से NDJSON
लाइन-दर-लाइन JSON को बाँटने के लिए कुछ चाहिए, और यहाँ बाँट पार्स किए डेटा के बाहरी हिस्से में मौजूद किसी सूची पर होती है। XML पार्स करना कभी सूची नहीं देता: नतीजा हमेशा एक ऑब्जेक्ट है, जिसकी एक ही कुंजी रूट एलिमेंट का नाम है, जिसके भीतर बाक़ी सब है। एक मूल्य अंदर, एक लाइन बाहर।
यह फ़ाइल चाहे कितनी बड़ी हो और उसमें कितने दोहराए एलिमेंट हों, बात यही रहती है। दस हज़ार रिकॉर्ड का 40 MB निर्यात एक ही 40 MB लाइन में बदलता है। कुछ खोता नहीं और कुछ बँटता नहीं, और अगर चाहिए था दस हज़ार लाइनें, तो यह बदलाव वह नहीं करता।
जो रास्ता काम करता है वह दो-चरणों वाला है। फ़ाइल को पहले JSON में बदलिए, फिर jq से चलाइए: दोहराए एलिमेंट का रास्ता चुनिए, उस पर पुनरावृति कीजिए, और हर ऑब्जेक्ट को अपनी लाइन पर लाने के लिए compact आउटपुट फ़्लैग इस्तेमाल कीजिए। यह एक ही कमांड है, स्क्रिप्ट में दोहराया जा सकता है, और रिकॉर्ड की परिभाषा आपके हाथ में रखता है।
कोई कन्वर्टर अकेले दस्तावेज़ से यह चुनाव नहीं कर सकता। किसी RSS फ़ीड में रिकॉर्ड item एलिमेंट है; किसी SOAP जवाब में शायद body के तीन स्तर भीतर कोई पंक्ति हो; किसी बैंक निर्यात में जो भी वेंडर ने लेन-देन कहा हो।
यह जोड़ी बेकार नहीं है। अगर इनपुट एक बड़े दस्तावेज़ के बजाय कई छोटे XML दस्तावेज़ हैं — इनवॉइस की डायरेक्टरी, मैनिफ़ेस्ट का फ़ोल्डर, प्रति-इवेंट पेलोड का बैच — तो प्रति फ़ाइल एक लाइन ठीक वही आकार है जो कोई लोडर चाहता है, और आउटपुट जोड़ने पर प्रति स्रोत दस्तावेज़ एक रिकॉर्ड वाली मान्य NDJSON धारा बनती है।
यह इन्वेंट्री के लिए भी काम करता है। किसी रिपॉज़िटरी की हर config फ़ाइल बदलकर लाइनें जोड़ना उन फ़ाइलों में क्या है इसका खोजने लायक़ डेटासेट देता है, जो सचमुच काम की चीज़ है और किसी और तरीक़े से पाना मुश्किल है।
रिकॉर्ड बाँटने के बाद भी XML का एक बर्ताव साथ रहता है। दोहराया एलिमेंट सरणी तभी बनता है जब वह दोहराए: एक टैग वाला रिकॉर्ड स्ट्रिंग देता है, दो वाला स्ट्रिंग की सूची। एक ही निर्यात में कुछ लाइनों में सरणी होगी और कुछ में नहीं।
स्कीमा-ऑन-रीड स्टोर पहली दिखी लाइनों से प्रकार का अंदाज़ा लगाता है और बाक़ी को ठुकरा या ज़बरदस्ती बदल देता है। सुधार लोडर में नहीं, jq पास में होना चाहिए: हर वह फ़ील्ड जो दोहरा सकती है उसे सरणी में सामान्य कीजिए, हर लाइन लिखते वक़्त।
बिना इंडेंट का सघन JSON, कुंजियाँ दस्तावेज़ क्रम में, एक नई लाइन पर ख़त्म। एट्रिब्यूट @ उपसर्ग वाली कुंजियों की तरह दिखते हैं, और जिस टैग में एट्रिब्यूट और पाठ दोनों हों उसका पाठ #text नाम की कुंजी में आता है। नेमस्पेस उपसर्ग कुंजी नाम के भीतर ही रहता है, इसलिए soap:Body ऐसी कुंजी है जिसमें कोलन है।
ये आख़िरी दोनों लोड से पहले हटाने लायक़ हैं। कोलन और सवालिया निशान वाले फ़ील्ड नाम कई क्वेरी इंजन और टेबल स्कीमा में अजीब या अमान्य होते हैं, और घोषणा फ़ाइल के बारे में मेटाडेटा है, फ़ाइल का डेटा नहीं।
जो मूल्य संख्या जैसा दिखे उसे पार्स कर दिया जाता है, एट्रिब्यूट और एलिमेंट पाठ दोनों में। यह गिनती के लिए सुविधाजनक है और पहचान के लिए विनाशकारी: 007 लिखा ऑर्डर संदर्भ संख्या 7 बनकर आता है, और 1.0 लिखा वर्शन एट्रिब्यूट 1 बनकर।
एक हालत उम्मीद से बेहतर बरतती है: JSON संख्या के रूप में न टिकने लायक़ बहुत लंबा पूर्णांक गोल होने के बजाय स्ट्रिंग रहता है, इसलिए उन्नीस अंकों का कोई संदर्भ पूरा बचा रहता है।
NDJSON को jq, pandas (lines विकल्प के साथ) और आम वेयरहाउस लोडर सीधे पढ़ते हैं। Elasticsearch bulk को हर दस्तावेज़ से पहले एक action लाइन चाहिए, जो रिकॉर्ड बाँटने वाले उसी jq पास में जोड़ी जा सकती है।
इस जोड़ी के लिए ख़ास तौर पर योजना बनाने लायक़ चीज़ है लाइन लंबाई। लाइन-दर-लाइन पढ़ने वाला रीडर पूरी लाइन याददाश्त में रखता है, इसलिए पूरे-दस्तावेज़ की लाइन पूरे-दस्तावेज़ का बफ़र है, और गंतव्य की कोई भी प्रति-रिकॉर्ड आकार सीमा पूरी फ़ाइल पर लागू होती है।
अगर निर्यात बड़ा है, नियमित रूप से आता है, और हर बार धारा बनना है, तो ईमानदार सलाह है कि किसी ब्राउज़र कन्वर्टर की जगह स्ट्रीमिंग पार्सर इस्तेमाल कीजिए। स्ट्रीमिंग पार्सर पूरा पेड़ याददाश्त में बनाए बिना XML फ़ाइल को एलिमेंट-दर-एलिमेंट पढ़ता है, और उसी लूप से प्रति रिकॉर्ड एक JSON लाइन लिखना किसी भी भाषा में छोटा प्रोग्राम है।
यह तरीक़ा याददाश्त से बड़ी फ़ाइलों में भी टिकता है, जो इस पन्ने का कोई भी हिस्सा नहीं करता — पार्सिंग यहाँ पहली बाइट लिखे जाने से पहले पूरा दस्तावेज़ JavaScript ऑब्जेक्ट के रूप में बना लेती है।
XML टिप्पणियाँ पार्स करते वक़्त छूट जाती हैं और NDJSON के पास उन्हें रखने के लिए कोई सिंटैक्स नहीं, इसलिए निर्यात के भीतर की कोई भी दस्तावेज़ीकरण चली जाती है। कोई हेडर, कोई स्कीमा और कोई प्रस्तावना भी नहीं: NDJSON फ़ाइल की हर लाइन एक रिकॉर्ड है, और लोडर फ़ाइल के ऊपर मौजूद किसी भी चीज़ को रिकॉर्ड की तरह पढ़ने की कोशिश करेगा।
अगर लोड को यह रिकॉर्ड करना है कि डेटा कहाँ से आया, तो वह किसी रिकॉर्ड की फ़ील्ड में या फ़ाइल नाम में जाना चाहिए। उसे पहली लाइन की तरह जोड़ना फ़ाइल को अपने मक़सद के लिए अमान्य बना देता है।
| XML | NDJSON | |
|---|---|---|
| पूरा नाम | Extensible Markup Language | Newline-Delimited JSON |
| फ़ाइल एक्सटेंशन | .xml | .ndjson, .jsonl |
| मीडिया टाइप | application/xml | application/x-ndjson |
| पहली बार प्रकाशित | 1998 | 2013 |
| प्रकाशक | W3C | — |
| विनिर्देश | XML 1.0 | — |
| लाइसेंस | खुला मानक | खुला मानक |
| आज की स्थिति | मौजूदा | मौजूदा |
| ब्राउज़र में खुलता है | हर ब्राउज़र | कोई ब्राउज़र नहीं |
| इसकी जगह विचारणीय | JSON, YAML | JSON, CSV |
टिप्पणियाँ साथ नहीं जातीं। XML में फ़ाइल के साथ समझाइश लिखी जा सकती है और NDJSON में उसके लिए कोई वाक्य-रचना ही नहीं, इसलिए हर समझाने वाली पंक्ति छूट जाती है — और चोट ठीक उन्हीं फ़ाइलों पर पड़ती है जिन पर टिप्पणियाँ लिखी जाती हैं: वह कॉन्फ़िगरेशन जिसे किसी और को सँभालना है।
NDJSON को कोई भी ब्राउज़र नहीं पढ़ता। इस लिहाज़ से दोनों में यही कम जगह चलने वाला है। भेजने से पहले देख लीजिए कि पाने वाला इसे लेता भी है या नहीं।
दोनों तरफ़ के प्रोग्राम अलग हैं: XML फ़ाइल Visual Studio Code और oXygen XML Editor में खुलती है और NDJSON फ़ाइल jq और pandas में — यानी नतीजा जिसके पास जाएगा, उसे दूसरी सूची में से कोई प्रोग्राम चाहिए होगा।
XML W3C का फ़ॉर्मेट है, जो 1998 में आया। यह XML 1.0 में तय किया गया है, और अगर फ़ाइल को उस औज़ार से ज़्यादा जीना है जिसने उसे लिखा, तो यह बात क़ीमती है।
NDJSON 2013 से चला आ रहा है। jq और pandas इस फ़ॉर्मेट को पढ़ लेते है।
XML 1998 में आया और NDJSON 2013 में। किसी को सौंपने के लिए आम तौर पर पुराना वाला ज़्यादा सुरक्षित रहता है; नया वाला वही काम कम बाइट में कर देता है।
नहीं। यह कन्वर्ज़न पूरी तरह आपके ब्राउज़र में होता है, इसलिए फ़ाइल आपके डिवाइस से बाहर नहीं जाती। आप ख़ुद जाँच सकते हैं: डेवलपर टूल्स का नेटवर्क टैब खोलिए और कुछ बदल कर देखिए। आपको पेज ख़ुद दिखेगा और आँकड़ों तथा विज्ञापन के वे अनुरोध दिखेंगे जिनसे इस सेवा का ख़र्च निकलता है — और एक भी ऐसा अनुरोध नहीं जो आपकी फ़ाइल साथ ले जा रहा हो।
हाँ। न खाता, न वॉटरमार्क, और न कोई रोज़ का कोटा जो ख़त्म हो: यह आपकी अपनी मशीन पर चलता है, इसलिए आप जितनी बार चाहें लौट सकते हैं। ब्राउज़र 100 MB तक की फ़ाइलें सँभालता है, एक बार में 100।
XML और NDJSON सामग्री का वर्णन बुनियादी तौर पर अलग-अलग तरीक़ों से करते हैं। इसलिए यह कन्वर्ज़न नक़ल नहीं, पुनर्निर्माण है: ईमानदार, पर बाइट-दर-बाइट एक जैसा नहीं। XML के गुण और लिखावट वाली गाँठें — दोनों कुंजी बन जाते हैं, और यह फ़ैसला कन्वर्टर आपकी जगह ख़ुद करता है।
NDJSON को कोई भी ब्राउज़र नहीं पढ़ता। इस लिहाज़ से दोनों में यही कम जगह चलने वाला है। भेजने से पहले देख लीजिए कि पाने वाला इसे लेता भी है या नहीं।
टिप्पणियाँ साथ नहीं जातीं। XML में फ़ाइल के साथ समझाइश लिखी जा सकती है और NDJSON में उसके लिए कोई वाक्य-रचना ही नहीं, इसलिए हर समझाने वाली पंक्ति छूट जाती है — और चोट ठीक उन्हीं फ़ाइलों पर पड़ती है जिन पर टिप्पणियाँ लिखी जाती हैं: वह कॉन्फ़िगरेशन जिसे किसी और को सँभालना है।