- CSV को बदलने वाले "श्रेष्ठ" फ़ॉर्मैट अक्सर पेश किए जाते हैं, लेकिन ज़्यादातर तुलना पक्षपाती होती है और CSV की असली ताकतों को नज़रअंदाज़ करती है
- इस लेख का मकसद यह कहना नहीं है कि CSV परफ़ेक्ट है, बल्कि इसके कम आंके गए फ़ायदों पर रोशनी डालना है
- CSV से नफ़रत करना कूल समझे जाने वाले माहौल के उलट, यह लेख CSV की असली अहमियत को फिर से याद दिलाता है
1. CSV बेहद सरल है
- CSV की परिभाषा उसके नाम में ही है: "comma-separated values"
- पंक्तियाँ newline से और कॉलम comma से अलग होते हैं
- अगर किसी value में comma या newline हो, तो उसे quotes में रखा जाता है, और quote को खुद double quote से दर्शाया जाता है
- बिना किसी जटिल specification के, कोई भी इसे सहज रूप से समझ और इस्तेमाल कर सकता है
- फिर भी, सही parsing के लिए dedicated CSV parser का उपयोग करना अब भी ज़रूरी है
2. CSV एक सामूहिक विचार है
- इसका कोई मालिक नहीं है, यह निजी नियंत्रण में नहीं है
- RFC 4180 मौजूद है, लेकिन ज़्यादातर लोग इसे सिर्फ़ संदर्भ के रूप में देखते हैं
- यह दुनिया भर के developers द्वारा चुपचाप साझा किए गए आम नियमों पर आधारित एक मुक्त फ़ॉर्मैट है
3. CSV टेक्स्ट है
- JSON, YAML, XML की तरह यह भी इंसानों द्वारा पढ़ा जा सकने वाला pure text फ़ॉर्मैट है
- इसे किसी भी text editor में खोला जा सकता है, और बिना अलग tool के भी इसकी सामग्री देखी जा सकती है
- encoding का तरीका भी अपनी ज़रूरत के अनुसार चुना जा सकता है
4. CSV streaming के लिए अनुकूलित है
- क्योंकि इसे line-by-line पढ़ा जाता है, इसलिए memory की खपत बहुत कम होती है
- साधारण code से भी कई gigabytes डेटा को सिर्फ़ कुछ KB memory में process किया जा सकता है
- Parquet जैसे column-oriented फ़ॉर्मैट में streaming processing कठिन होती है और जटिल buffering चाहिए होती है
- इसकी कमी यह है कि अगर आपको सिर्फ़ कोई एक कॉलम देखना हो, तब भी पूरी row पढ़नी पड़ती है
5. CSV में आसानी से data append किया जा सकता है
- फ़ाइल को append mode(
a+) में खोलकर आखिर में नई rows जोड़ना बहुत आसान है
- इसके उलट Parquet जैसे column-oriented फ़ॉर्मैट में row जोड़ना अक्षम और जटिल होता है
6. CSV dynamic types को सपोर्ट करता है
- इसमें fixed types नहीं होते, इसलिए डेटा की व्याख्या लचीले ढंग से की जा सकती है
- उदाहरण: JavaScript 64-bit integers को ठीक से represent नहीं कर पाता, लेकिन CSV में ऐसी पाबंदी नहीं है
- इससे भाषाओं के बीच compatibility और flexibility का फ़ायदा मिलता है
- लेकिन अगर गलत interpret किया जाए तो error हो सकती है → इसलिए इस्तेमाल में सावधानी चाहिए
- अगर high performance चाहिए, तो text decode किए बिना binary स्तर पर सीधे processing भी संभव है
7. CSV संक्षिप्त है
- header सिर्फ़ फ़ाइल की शुरुआत में होता है, इसलिए फ़ॉर्मैट की पुनरावृत्ति लगभग नहीं होती
- JSON और XML में keys की पुनरावृत्ति के कारण overhead ज़्यादा होता है
- string representation भी पहले से संक्षिप्त है, और फ़ॉर्मैट का खुद का overhead (comma, quotes आदि) बहुत कम है
8. उलटा किया गया CSV भी फिर भी वैध रहता है
- CSV को byte स्तर पर उलट देने पर भी वह अब भी वैध CSV रहता है
- यह double quote escaping के तरीके की वजह से संभव है, क्योंकि यह palindrome जैसी escaping शैली है
- इस गुण की वजह से CSV फ़ाइल के आख़िरी हिस्से को बहुत कुशलता से पढ़ा जा सकता है
- उदाहरण: किसी रुकी हुई process को फिर से शुरू करते समय, फ़ाइल की आख़िरी कुछ lines पढ़कर restart किया जा सकता है
9. Excel को CSV पसंद नहीं है
- अगर Excel को कोई फ़ॉर्मैट असुविधाजनक लगता है, तो शायद यह इस बात का संकेत है कि आप सही रास्ते पर हैं
3 टिप्पणियां
सरल ही सबसे बेहतर है!
Worse is better!
Hacker News टिप्पणियाँ
लोगों को CSV और INI फ़ाइलें इसलिए पसंद हैं क्योंकि वे सरल हैं, text-based हैं, फ़ॉर्मैट में types encode नहीं होते, और वे सिर्फ strings से बनी होती हैं
CSV सुंदर है, लेकिन इसमें एक घातक कमी है — quotes का असर "non-local" होता है
CSV की सबसे अच्छी बात यह है कि कोई भी 30 मिनट में parser लिख सकता है
जिसे CSV पसंद है, उससे शायद कभी enterprise environment में CSV injection prevention संभालने के लिए नहीं कहा गया होगा
CSV को पसंद करने के कई कारण हैं
हाल में Raspberry Pi आधारित solution विकसित किया जा रहा है
CSV की एक कम मज़ेदार बात यह है कि जल्दी में लिखे गए parser और serializer अक्सर quotes को गलत handle करने वाली आम गलतियों को दोहराते हैं
अगर यह सचमुच एक love letter होता, तो इसे CSV format में लिखा गया होता
JSON के खिलाफ़ तर्क बहुत ज़्यादा प्रभावशाली नहीं हैं
आधुनिक formats पसंद करने वाले व्यक्ति के रूप में, संदेह होने पर CSV या JSONL का उपयोग किया जाता है
grepसे आसानी से खोजा जा सकता है और यह streaming के लिए उपयुक्त है