आँकड़ों और विज्ञापन के लिए कुकीज़
हम आँकड़ों और विज्ञापन के लिए कुकीज़ इस्तेमाल करते हैं, दोनों Google को जाती हैं। मना करने से आपको दिखने वाली किसी चीज़ में कोई फ़र्क़ नहीं पड़ता।निजता पेज पढ़ें
यहाँ आप XLSX को NDJSON में बदलते हैं, मुफ़्त और बिना खाते के: फ़ाइल ऊपर छोड़िए और कुछ ही सेकंड में नतीजा डाउनलोड के लिए तैयार मिलेगा। कन्वर्ज़न आपके अपने ब्राउज़र के भीतर होता है, इसलिए फ़ाइल कभी अपलोड नहीं होती। यह Windows, macOS और Linux पर वैसे ही चलता है जैसे iPhone और Android पर, और कनेक्शन काट देने पर भी चलता रहता है।
एक बार में 100 फ़ाइलें। फ़ॉर्मेट अलग-अलग हों तो भी चलेगा।
ये एक के बाद एक बदलती हैं और साथ में एक ZIP बनकर उतरती हैं।
XLSX से NDJSON
JSON ऐरे एक ही मान है। उसमें आख़िरी ऑब्जेक्ट पढ़ने के लिए पहले सब कुछ पार्स करना पड़ता है, यानी पूरा दस्तावेज़ मेमोरी में रखना या partial बनावट समझने वाला streaming parser इस्तेमाल करना। कॉन्फ़िग फ़ाइल के लिए यह बेमानी है। चालीस लाख पंक्तियों के लिए यही फ़र्क़ है काम करते import और ऑपरेटिंग सिस्टम के मार डाले प्रोसेस के बीच।
Newline-delimited JSON कंटेनर हटाकर समस्या हटा देता है। हर लाइन पूरा, स्वतंत्र JSON मान है, तो पढ़ने वाला एक लाइन पढ़ता है, कुछ करता है, छोड़ देता है और तय मेमोरी के साथ आगे बढ़ता है। यही इकलौता गुण है जिसके लिए bulk loader, log shipper और वेयरहाउस ingest काम सब एक ही शक्ल पर मिल गए।
यह गारंटी तभी टिकती है जब डेटा में कुछ भी अपनी तरफ़ से नई लाइन न बना सके, और यह बदलाव इसे लागू करता है। लाइन-ब्रेक वाला सेल — कई-लाइन का पता, Alt+Enter से टाइप की टिप्पणी — JSON स्ट्रिंग के भीतर escape होकर लिखा जाता है, तो रिकॉर्ड एक लाइन पर रहता है। सेल के भीतर tab भी उसी तरह escape होता है।
यह delimited फ़ाइल के मुक़ाबले असली फ़ायदा है। उसी शीट का tab-separated एक्सपोर्ट किसी अजीब सेल को उद्धरण चिह्न में लपेटने पर निर्भर है और उम्मीद करता है reader वह रिवाज़ जानता हो; यहाँ लागू करने को कुछ नहीं। फ़ाइल को दस-हज़ार-लाइन के टुकड़ों में बाँटना सुरक्षित है, लाइन गिनना ही रिकॉर्ड गिनती है।
Delimited फ़ाइल में एक टाइप होता है: टेक्स्ट। जो भी पढ़ता है उसे अंदाज़ा लगाना पड़ता है, और यहीं पहचान संख्या पूर्णांक बन जाती है और वर्ज़न नंबर दशमलव। JSON फ़र्क़ साफ़ रखता है, तो मात्रा 12 लिखी जाती है, फ़्लैग true, गुम मान null, और स्प्रेडशीट में टेक्स्ट रहा प्रोडक्ट कोड अपने अगुआ शून्य लिए quote में रहता है।
टाइप्ड गंतव्य में लोड करने के लिए यह असली समय बचाता है। जिस स्कीमा की आप घोषणा करते हैं और जो मान आप देते हैं वे बीच में coercion परत के बिना सहमत होते हैं। टाइप स्प्रेडशीट से आते हैं, टेक्स्ट पर अंदाज़े से नहीं — यही अहम हिस्सा है।
हर लाइन हर कुंजी दोहराती है। छह कॉलम की पचास हज़ार पंक्तियों का मतलब है छह फ़ील्ड नामों की पचास हज़ार प्रतियाँ, जो एक असली शीट पर क़रीब 4.4 MB बनीं, उसी डेटा के tab-separated टेक्स्ट के 1.8 MB के मुक़ाबले — क़रीब ढाई गुना।
यह सौदा इस गंतव्य के लिए आम तौर पर सही है, क्योंकि फ़ाइल किसी मशीन से एक बार पढ़ी जाने वाली है, हमेशा के लिए सहेजी जाने वाली नहीं। अगर वही रिकॉर्ड बार-बार क्वेरी होने हैं, columnar शक्ल बेहतर है। NDJSON परिवहन फ़ॉर्मेट है, भंडारण फ़ॉर्मेट नहीं।
औज़ार इसी बनावट से निकलते हैं। `wc -l` सटीक पंक्ति गिनती देता है, क्योंकि प्रति रिकॉर्ड एक लाइन है और आख़िर में नई लाइन। `head -1` फ़ील्ड नाम वैसे दिखाता है जैसे असल में लिखे गए। `split -l 10000` ऐसे टुकड़े देता है जो अपने आप में वैध हैं।
इससे ज़्यादा के लिए, jq एक दस्तावेज़ की बजाय मानों की धारा पढ़ता है, तो `jq -c "select(.qty > 100)"` मेमोरी से बड़ी फ़ाइल फ़िल्टर करता है और वही फ़ॉर्मेट देता है जो पढ़ा। यही रचनाशीलता इस शक्ल में बदलने की वजह है।
हर API जो newline-delimited JSON कहता है वही मतलब नहीं रखती। Elasticsearch और OpenSearch bulk रिक्वेस्ट हर दस्तावेज़ से पहले एक निर्देश लाइन लपेटते हैं, तो body में रिकॉर्ड से दोगुनी लाइनें होती हैं और यह आउटपुट payload की बजाय कच्चा माल है।
फ़ॉर्मेट को जैसा है वैसा लेने वाले loader भी हैं और आम मामला हैं: newline-delimited JSON पर तय वेयरहाउस load काम, प्रति संदेश एक लाइन पढ़ने वाला queue producer। गंतव्य का दस्तावेज़ जाँचिए कि उसे रिकॉर्ड चाहिए या request body।
स्प्रेडशीट में तारीख़ दिन-गिनती है जो display फ़ॉर्मेट पहने है, और बदलाव दिखावट की बजाय मान लिखता है: 1 जनवरी 2024 45292 बन जाती है, और टाइमस्टैम्प उसी संख्या में समय का भिन्न जोड़ता है। गिनती दिसंबर 1899 के आख़िर से शुरू होती है।
यह इस जोड़ी पर ख़ास तौर पर देखने लायक़ नाकामी है, क्योंकि JSON संख्याएँ वैध हैं और numeric कॉलम वाला loader 45292 बिना कुछ बताए स्वीकार लेगा। उन फ़ील्ड को जान-बूझकर बदलिए — फ़ाइल पर jq क़दम में, या loading के बाद लक्ष्य में।
ख़ाली सेल छोड़ने की बजाय null लिखा जाता है, तो हर ऑब्जेक्ट एक जैसी कुंजियाँ रखता है। जहाँ बाद की पंक्तियाँ ऐसा फ़ील्ड लाती हैं जो पहले नहीं था, कुंजी सेट पूरी शीट का मिलन है, तो देर से आने के लिए कुछ नहीं छूटता।
वर्कबुक की सिर्फ़ पहली शीट बदली जाती है, क्योंकि रिकॉर्ड की धारा के पास "अब एक और टेबल" कहने का कोई तरीक़ा नहीं। ज़रूरी शीट पहली न हो तो वर्कबुक का क्रम बदलकर दोबारा बदलिए।
सब कुछ आपके ब्राउज़र में होता है। वर्कबुक पार्स होकर लाइनें स्थानीय तौर पर लिखी जाती हैं, बिना अपलोड, बिना कतार — जो ग्राहक रिकॉर्ड, ऑर्डर या किसी डेटा-सुरक्षा नीति के तहत आने वाली चीज़ के एक्सपोर्ट के लिए काम पर इस्तेमाल कर सकने और न कर सकने वाले टूल के बीच फ़र्क़ है।
सीमा प्रति वर्कबुक 100 MB और एक ड्रॉप में 100 फ़ाइल है, सबके लिए बराबर। उस आँकड़े से बहुत पहले मेमोरी महसूस होगी, क्योंकि शीट को लिखे जाने से पहले ऐरे में पढ़ा जाता है।
अगर पढ़ने वाला ऐसा प्रोग्राम है जो पूरी फ़ाइल पढ़कर किसी और चीज़ को सौंपेगा — fixture, seed script, request body — JSON ऐरे वही शक्ल है जिसकी उसे उम्मीद है, और NDJSON सिर्फ़ एक जोड़ने का क़दम बढ़ाता है।
अगर रिकॉर्ड बार-बार क्वेरी होने हैं, एक बार लोड होने की बजाय, Parquet में बदलिए: वही पंक्तियाँ, बाइट का एक हिस्सा, और दो फ़ील्ड छूने वाली क्वेरी हर लाइन की बजाय दो कॉलम पढ़ती है। NDJSON डेटा हिलते समय सही जवाब है, पहुँचने के बाद कमज़ोर।
| XLSX | NDJSON | |
|---|---|---|
| पूरा नाम | Excel वर्कबुक | Newline-Delimited JSON |
| फ़ाइल एक्सटेंशन | .xlsx | .ndjson, .jsonl |
| मीडिया टाइप | application/vnd.openxmlformats-officedocument.spreadsheetml.sheet | application/x-ndjson |
| पहली बार प्रकाशित | 2007 | 2013 |
| प्रकाशक | Microsoft | — |
| विनिर्देश | ECMA-376 | — |
| लाइसेंस | खुला मानक | खुला मानक |
| आज की स्थिति | मौजूदा | मौजूदा |
| ब्राउज़र में खुलता है | कोई ब्राउज़र नहीं | कोई ब्राउज़र नहीं |
| इसकी जगह विचारणीय | CSV, ODS, Parquet | JSON, CSV |
दोनों तरफ़ के प्रोग्राम अलग हैं: XLSX फ़ाइल Microsoft Excel, LibreOffice Calc और Google Sheets में खुलती है और NDJSON फ़ाइल jq और pandas में — यानी नतीजा जिसके पास जाएगा, उसे दूसरी सूची में से कोई प्रोग्राम चाहिए होगा।
दोनों का निशाना अलग काम है: XLSX का एडिटिंग पर, NDJSON का प्रोग्रामों के बीच डेटा ले जाना और स्ट्रीमिंग पर। इस पर सोचना बनता है, क्योंकि जिस वजह से एक मौजूद है, आम तौर पर उसी वजह से दूसरा असुविधाजनक होता है।
XLSX Microsoft का फ़ॉर्मेट है, जो 2007 में आया। यह ECMA-376 में तय किया गया है, और अगर फ़ाइल को उस औज़ार से ज़्यादा जीना है जिसने उसे लिखा, तो यह बात क़ीमती है।
NDJSON 2013 से चला आ रहा है। jq और pandas इस फ़ॉर्मेट को पढ़ लेते है।
नहीं। यह कन्वर्ज़न पूरी तरह आपके ब्राउज़र में होता है, इसलिए फ़ाइल आपके डिवाइस से बाहर नहीं जाती। आप ख़ुद जाँच सकते हैं: डेवलपर टूल्स का नेटवर्क टैब खोलिए और कुछ बदल कर देखिए। आपको पेज ख़ुद दिखेगा और आँकड़ों तथा विज्ञापन के वे अनुरोध दिखेंगे जिनसे इस सेवा का ख़र्च निकलता है — और एक भी ऐसा अनुरोध नहीं जो आपकी फ़ाइल साथ ले जा रहा हो। इस जोड़ी के पीछे SheetJS है, JavaScript में लिखा स्प्रेडशीट का एक पाठक और लेखक; आपका ब्राउज़र इसे एक बार उतारता है और फिर सहेज कर रखता है।
हाँ। न खाता, न वॉटरमार्क, और न कोई रोज़ का कोटा जो ख़त्म हो: यह आपकी अपनी मशीन पर चलता है, इसलिए आप जितनी बार चाहें लौट सकते हैं। ब्राउज़र 100 MB तक की फ़ाइलें सँभालता है, एक बार में 100। SheetJS आपकी अपनी मशीन पर उतरता है और वहीं चलता है — इसीलिए उस पर कोई गिनती नहीं है।
XLSX और NDJSON सामग्री का वर्णन बुनियादी तौर पर अलग-अलग तरीक़ों से करते हैं। इसलिए यह कन्वर्ज़न नक़ल नहीं, पुनर्निर्माण है: ईमानदार, पर बाइट-दर-बाइट एक जैसा नहीं। सिर्फ़ पहली शीट पढ़ी जाती है, और उसमें भी सिर्फ़ मान। सूत्र, फ़ॉर्मैटिंग, कॉलम की चौड़ाई और पहली के बाद की हर शीट पीछे रह जाती है।
कन्वर्ज़न के लिए नहीं: वह उसी ब्राउज़र में होता है जो आपने पहले से खोल रखा है। नतीजा खोलने के लिए उसके बाद वही प्रोग्राम चाहिए जिससे आपका डिवाइस Newline-Delimited JSON आम तौर पर दिखाता है।