XLSX को CSV में कैसे बदलें (एन्कोडिंग की सिरदर्दी से बचें)
XLSX से CSV रूपांतरण क्यों गलत हो जाते हैं
वे बहुत समान लगते हैं। XLSX और CSV दोनों डेटा की तालिकाएँ हैं, है ना? लेकिन अंदर से, वे पूरी तरह से अलग हैं। एक XLSX फ़ाइल एक जटिल पैकेज है—XML दस्तावेज़ों का एक ज़िप संग्रह जिसमें कई शीट, रिच सेल फ़ॉर्मेटिंग, सूत्र और यहाँ तक कि छवियाँ भी होती हैं। एक CSV सिर्फ़ टेक्स्ट है। पंक्तियाँ एक नई लाइन के साथ समाप्त होती हैं, कॉलम को अल्पविराम (comma) जैसे किसी वर्ण से विभाजित किया जाता है। जब आप उस समृद्ध XLSX संरचना को सादे टेक्स्ट में समतल करते हैं, तो आप परेशानी को न्योता दे रहे होते हैं। सबसे बड़ी सिरदर्दी एन्कोडिंग के मेल न खाने से होती है। यदि आपकी स्प्रेडशीट में कोई विशेष वर्ण हैं—जैसे é या ñ जैसे एक्सेंट वाले अक्षर, € जैसे मुद्रा प्रतीक, या गैर-लैटिन टेक्स्ट—तो आउटपुट CSV को निश्चित रूप से सही कैरेक्टर एन्कोडिंग का उपयोग करना चाहिए, जो लगभग हमेशा UTF-8 होता है। कई उपकरण Windows-1252 जैसी पुरानी एन्कोडिंग को डिफ़ॉल्ट के रूप में उपयोग करते हैं, जो उन वर्णों को प्रश्न चिह्नों में बदल देगा। एक ग्राहक का नाम जैसे 'José García' बदलकर 'Jos? Garc?a' हो जाता है, और आपका CRM इम्पोर्ट विफल हो जाता है। डिलिमिटर (delimiter) का टकराव एक और क्लासिक समस्या है। यदि आपका CSV कॉलम को अलग करने के लिए अल्पविराम का उपयोग करता है, तो उस सेल का क्या होता है जिसमें अल्पविराम होता है, जैसे कि एक पता '14 Oak Street, Suite 200'? एक अच्छा CSV राइटर उस मान को दोहरे उद्धरण चिह्नों (double quotes) में लपेटता है। लेकिन अगर डेटा में ही दोहरे उद्धरण चिह्न हैं, तो उन्हें दोगुना करके एस्केप किया जाना चाहिए ('He said "hello"' बदलकर '"He said ""hello"""' हो जाता है)। यह जानना कि ये बारूदी सुरंगें कहाँ छिपी हैं, आपको घंटों की दर्दनाक डीबगिंग से बचाएगा।
एन्कोडिंग का निर्णय: UTF-8, UTF-8 BOM, या कुछ और
कुछ भी बदलने से पहले, एक महत्वपूर्ण निर्णय लें: आपके गंतव्य सिस्टम को किस एन्कोडिंग की आवश्यकता है? इसे सही कर लें, और आप अधिकांश रूपांतरण समस्याओं से बच जाएंगे। लगभग हर आधुनिक सिस्टम के लिए, UTF-8 ही जवाब है। बस। डेटाबेस, Python स्क्रिप्ट, वेब APIs—वे सभी UTF-8 को पूरी तरह से समझते और संभालते हैं। यदि आप CSV को `pd.read_csv()` के साथ पांडा में पाइप कर रहे हैं, तो UTF-8 डिफ़ॉल्ट है और यह बस काम करता है। यही बात PostgreSQL की `COPY` कमांड या MySQL की `LOAD DATA INFILE` पर भी लागू होती है जब आप `CHARACTER SET utf8mb4` निर्दिष्ट करते हैं। फिर आता है UTF-8 with BOM (बाइट ऑर्डर मार्क)। यह संस्करण फ़ाइल की शुरुआत में तीन अदृश्य बाइट्स (0xEF, 0xBB, 0xBF) जोड़ता है। यह क्यों मौजूद है? Microsoft Excel की मदद करने के लिए। Windows पर, Excel अक्सर यह मान लेता है कि एक CSV Windows-1252 में एन्कोड किया गया है जब तक कि वह इस BOM को न देख ले, जिससे कोई भी विशेष वर्ण गड़बड़ हो जाता है। तो, यहाँ सरल नियम है: यदि कोई इंसान CSV को सीधे Excel में खोलेगा, तो UTF-8 BOM का उपयोग करें। यदि कोई स्क्रिप्ट या प्रोग्राम इसे पढ़ेगा, तो सादे UTF-8 का उपयोग करें, क्योंकि वह BOM कई पार्सर्स को रोक सकता है। Windows-1252 (या ANSI) और ISO-8859-1 (Latin-1) जैसी पुरानी एन्कोडिंग अब पुरानी हो चुकी हैं। वे केवल पश्चिमी यूरोपीय वर्णों का समर्थन करती हैं और अन्य भाषाओं के किसी भी डेटा को भ्रष्ट कर देंगी। आप उन्हें पुराने सिस्टम के साथ पा सकते हैं, लेकिन आपको उन्हें कभी भी नए वर्कफ़्लो के लिए नहीं चुनना चाहिए। CocoConvert का [XLSX से CSV कनवर्टर](/convert/xlsx-to-csv) आपको अपनी एन्कोडिंग शुरू में ही चुनने देता है, यह एक महत्वपूर्ण सुविधा है जिसे कई मुफ्त उपकरण न जाने क्यों छोड़ देते हैं। बस सिस्टम के लिए UTF-8 और Excel के लिए UTF-8 BOM चुनें।
चरण-दर-चरण: CocoConvert के साथ XLSX को CSV में बदलना
प्रक्रिया सरल है, लेकिन असली चुनौती छोटी-छोटी बातों में है। यहाँ कुछ सेटिंग्स आपके अंतिम आउटपुट को बना या बिगाड़ सकती हैं। 1. [CocoConvert के XLSX से CSV पेज](/convert/xlsx-to-csv) पर जाएं और अपनी फ़ाइल अपलोड करें। आप बिना खाते के 50 MB तक की फ़ाइलों को प्रोसेस कर सकते हैं, और बड़ी फ़ाइलों के लिए बस एक मुफ्त पंजीकरण की आवश्यकता होती है। यदि आपका XLSX वास्तव में बहुत बड़ा है—कुछ एंटरप्राइज़ एक्सपोर्ट सैकड़ों मेगाबाइट के हो सकते हैं—तो आपको लिब्रे ऑफिस कैल्क (LibreOffice Calc) या एक स्क्रिप्ट जैसे डेस्कटॉप टूल का उपयोग करना होगा, जिसे हम बाद में कवर करेंगे। 2. एक्सपोर्ट करने के लिए शीट चुनें। एक XLSX फ़ाइल में कई शीट हो सकती हैं, लेकिन एक CSV केवल एक का प्रतिनिधित्व कर सकता है। CocoConvert आपकी फ़ाइल से सभी शीट को एक ड्रॉपडाउन में सूचीबद्ध करता है। यदि आपको सभी शीट एक्सपोर्ट करने की आवश्यकता है, तो आपको उन्हें एक-एक करके बदलना होगा। 3. अपना डिलिमिटर चुनें। अल्पविराम मानक है, लेकिन यह एक भयानक विकल्प है यदि आपके डेटा में बहुत सारे अल्पविराम हैं (जैसे कि फ्री-टेक्स्ट विवरण या पते)। यूरोप में, सेमीकोलन एक सामान्य और अक्सर सुरक्षित विकल्प है। टैब-सेपरेटेड (TSV) एक और बढ़िया विकल्प है यदि आपके टेक्स्ट में अल्पविराम और सेमीकोलन दोनों हैं। 4. एन्कोडिंग सेट करें। आप पहले से ही जानते हैं: प्रोग्रामेटिक उपयोग के लिए UTF-8, यदि फ़ाइल किसी के Excel के लिए है तो UTF-8 BOM। 5. तय करें कि सूत्रों को कैसे संभालना है। CocoConvert एक सेल के परिकलित *मान* को एक्सपोर्ट करता है, न कि सूत्र को। `=SUM(A1:A10)` वाला एक सेल जो `4500` दिखाता है, CSV में `4500` बन जाएगा। 99% मामलों में आप यही चाहते हैं। यदि आपको वास्तव में सूत्र टेक्स्ट की आवश्यकता है, तो आपको पहली जगह में CSV में बदलना ही नहीं चाहिए। 6. डाउनलोड करें और सत्यापित करें। **इसे जांचने के लिए CSV को Excel में न खोलें।** इस पर मेरा विश्वास करें। इसे पहले एक असली टेक्स्ट एडिटर में खोलें, जैसे Windows पर Notepad++ या Mac पर BBEdit। ये उपकरण आपको कच्चा टेक्स्ट दिखाते हैं और आपको पुष्टि करने देते हैं कि एन्कोडिंग सही है। विशेष वर्णों वाली एक पंक्ति ढूंढें और सुनिश्चित करें कि वे सही दिख रहे हैं, इससे पहले कि आप इसे अपने लक्ष्य सिस्टम में आयात करने के बारे में सोचें।
इसे Excel और LibreOffice में करना (जब आपको स्थानीय नियंत्रण की आवश्यकता हो)
कभी-कभी आपको स्थानीय रूप से रूपांतरण करना पड़ता है। हो सकता है कि फ़ाइल में संवेदनशील डेटा हो जिसे अपलोड नहीं किया जा सकता है, या यह 200 MB की एक विशाल फ़ाइल है जो ऑनलाइन टूल को रोक देती है। Excel और LibreOffice दोनों यह काम कर सकते हैं, लेकिन दोनों की अपनी-अपनी ख़ासियतें हैं। Microsoft Excel में (Office 365 / Excel 2019+): अपना XLSX खोलें, File → Save As पर जाएँ, और 'Save as type' ड्रॉपडाउन में, 'CSV UTF-8 (Comma delimited) (*.csv)' चुनें। यह विकल्प, जिसे Microsoft ने *अंततः* Excel 2016 में जोड़ा, सही ढंग से UTF-8 BOM एन्कोडिंग के साथ सहेजता है। सावधान रहें कि सादा 'CSV (Comma delimited)' विकल्प न चुनें; यह प्राचीन Windows-1252 एन्कोडिंग का उपयोग करके सहेजता है, एक ऐसा जाल जिसने अनगिनत डेवलपर्स को फँसाया है। Excel आपको चेतावनी देगा कि केवल सक्रिय शीट ही सहेजी गई है। OK पर क्लिक करें और आपको आवश्यक किसी भी अन्य शीट के लिए दोहराएँ। LibreOffice Calc में (एक शानदार, मुफ्त, क्रॉस-प्लेटफ़ॉर्म टूल): फ़ाइल खोलें, File → Save a Copy... पर जाएँ ('Save As' का उपयोग करने से आपकी वर्तमान फ़ाइल बदल जाएगी)। प्रारूप के रूप में 'Text CSV (.csv)' चुनें और पुष्टि करें कि आप Keep Current Format चाहते हैं। यह स्पष्ट विकल्पों के साथ एक शक्तिशाली डायलॉग लाता है। आप फ़ील्ड डिलिमिटर, टेक्स्ट डिलिमिटर (इसे डबल कोट के रूप में छोड़ दें), और सबसे महत्वपूर्ण, कैरेक्टर सेट सेट कर सकते हैं। 'Unicode (UTF-8)' चुनें। LibreOffice सही ढंग से बिना BOM के एक सादा UTF-8 फ़ाइल बनाता है, जो इसे प्रोग्रामेटिक उपयोग के लिए आदर्श बनाता है। यहाँ दोनों उपकरणों की सीमा है: कोई भी आपको यह नियंत्रित नहीं करने देता कि nulls, खाली सेल, या बूलियन को कैसे दर्शाया जाता है। यदि आपकी डाउनस्ट्रीम प्रक्रिया को nulls के लिए केवल कुछ नहीं के बजाय खाली स्ट्रिंग्स की आवश्यकता है, या `TRUE`/`FALSE` के बजाय `1`/`0` की उम्मीद है, तो यह संभव नहीं है। आपको बाद में CSV पर एक क्लीनअप पास स्क्रिप्ट करना होगा या शुरू से ही एक अधिक शक्तिशाली उपकरण का उपयोग करना होगा।
Python के साथ स्क्रिप्टेड रूपांतरण (दोहराए जाने वाले वर्कफ़्लो के लिए)
जब आपको एक ही तरह की XLSX फ़ाइल को बार-बार बदलना पड़ता है—जैसे कि अकाउंटिंग सिस्टम से एक साप्ताहिक रिपोर्ट—तो मैन्युअल क्लिक त्रुटि का एक नुस्खा है। एक साधारण Python स्क्रिप्ट तेज, अधिक विश्वसनीय है, और सेकंडों में चलती है। सबसे पहले, आपको `openpyxl` और `pandas` लाइब्रेरी की आवश्यकता होगी। उन्हें `pip install openpyxl pandas` के साथ इंस्टॉल करें। फिर, कोड उल्लेखनीय रूप से साफ है: ```python import pandas as pd df = pd.read_excel('report.xlsx', sheet_name='Sales Data', engine='openpyxl') df.to_csv('report.csv', index=False, encoding='utf-8') ``` `sheet_name` पैरामीटर शीट का नाम एक स्ट्रिंग के रूप में या उसका शून्य-आधारित इंडेक्स नंबर हो सकता है। `index=False` को न भूलें; यह पांडा को पहले कॉलम में अपने स्वयं के पंक्ति नंबर लिखने से रोकता है, जो निश्चित रूप से अधिकांश आयात उपकरणों को भ्रमित करेगा। `encoding` पैरामीटर के लिए, `'utf-8'` एक मानक, BOM-रहित UTF-8 फ़ाइल बनाता है। यदि आप जानते हैं कि आउटपुट सीधे एक Excel उपयोगकर्ता के पास जा रहा है, तो BOM को शामिल करने के लिए `'utf-8-sig'` का उपयोग करें। पांडा तारीखों के बारे में भी स्मार्ट है, उन्हें `datetime64` ऑब्जेक्ट्स में पार्स करता है। यह उन्हें ISO 8601 प्रारूप (`YYYY-MM-DD HH:MM:SS`) में लिखता है, जो अधिकांश डेटाबेस को पसंद है। यदि आपका लक्ष्य सिस्टम नखरे वाला है और उसे `MM/DD/YYYY` जैसा कुछ चाहिए, तो बस अपने `to_csv()` कॉल में `date_format='%m/%d/%Y'` तर्क जोड़ें। बड़ी फ़ाइलों (50,000+ पंक्तियाँ) के लिए, `openpyxl` पूरी फ़ाइल को मेमोरी में लोड करता है, इसलिए `pd.read_excel()` धीमा हो सकता है। लिखना भी एक बाधा हो सकता है। यदि आप मेमोरी सीमाओं का सामना कर रहे हैं, तो आप CSV को टुकड़ों में लिख सकते हैं। और यदि आप पुरानी `.xls` फ़ाइलों से निपट रहे हैं, तो `xlrd` इंजन तेज है, लेकिन आधुनिक `.xlsx` फ़ाइलों के लिए, `openpyxl` के साथ बने रहें। यदि आपके पास निर्यात करने के लिए कई शीट हैं, तो `pd.read_excel('report.xlsx', sheet_name=None)` एक जीवन रक्षक है। यह एक शब्दकोश लौटाता है जहाँ कुंजियाँ शीट के नाम हैं और मान डेटाफ़्रेम हैं। फिर आप इस शब्दकोश के माध्यम से लूप कर सकते हैं और प्रत्येक शीट को अपनी CSV फ़ाइल में सहेज सकते हैं—एक पूर्ण वर्कबुक निर्यात को स्वचालित करने का सही तरीका।
अपने डेटाबेस में डालने से पहले अपने CSV को मान्य करना
एक CSV पूर्वावलोकन में एकदम सही दिख सकता है और फिर भी आपके डेटाबेस आयात को तोड़ सकता है। जिसने भी 20 मिनट के बाद एक आयात कार्य को चुपचाप विफल होते देखा है, वह दर्द जानता है। कुछ त्वरित सत्यापन चरण इन गड़बड़ियों को जल्दी पकड़ सकते हैं। सबसे पहले, पंक्ति गणना की जाँच करें। यदि आपके XLSX में 12,847 डेटा पंक्तियाँ और एक हेडर था, तो आपके CSV में ठीक 12,848 लाइनें होनी चाहिए। Linux या macOS पर, `wc -l report.csv` आपको तुरंत जवाब देता है। यदि संख्याएँ मेल नहीं खाती हैं, तो সম্ভবত एक सेल में एक नई लाइन का वर्ण था—'नोट्स' फ़ील्ड में एक आम समस्या जहाँ उपयोगकर्ता बस Enter दबाते हैं। एक उचित CSV लेखक को इसे सही ढंग से उद्धृत करना चाहिए, लेकिन यह एक लगातार विफलता बिंदु है। इसके बाद, अपने विशेष वर्णों की जाँच करें। मूल XLSX में एक एक्सेंट, एक मुद्रा प्रतीक, या गैर-लैटिन टेक्स्ट वाली एक पंक्ति खोजें। अब CSV को एक टेक्स्ट एडिटर में खोलें जो फ़ाइल की एन्कोडिंग दिखाता है (VS Code और Notepad++ दोनों ऐसा करते हैं)। पुष्टि करें कि एन्कोडिंग वही है जो आपने चुनी थी और वर्ण सही ढंग से प्रस्तुत किए गए थे। डिलिमिटर का परीक्षण करें। यदि आपने अल्पविराम का उपयोग किया है, तो कच्चे टेक्स्ट में उन अल्पविरामों को खोजें जो उद्धरण चिह्नों के अंदर नहीं हैं। Linux पर एक त्वरित `grep` कमांड (`grep -P '(?<!\" ),[^\"\\n]*(?<!\" ),' report.csv`) उन पंक्तियों को खोजने में मदद कर सकता है जहाँ उद्धरण छूट गया हो, हालांकि आपको अपने विशिष्ट डेटा के लिए regex को थोड़ा बदलना पड़ सकता है। अंत में, कुछ कॉलम डेटा प्रकारों को मान्य करें। यदि एक कॉलम को सभी पूर्णांक होना चाहिए, तो इसे जांचें। Python में, आप CSV लोड कर सकते हैं और `pd.read_csv('report.csv')['order_id'].dtype` की जांच कर सकते हैं। इसे `int64` कहना चाहिए। यदि यह `object` कहता है, तो आपको एक समस्या है—एक भटका हुआ टेक्स्ट वर्ण, एक `#N/A` त्रुटि जिसे आपने अनदेखा कर दिया, या एक मुद्रा प्रतीक जो एक संख्यात्मक सेल में घुस गया। इन जाँचों के लिए पाँच मिनट लेने से आपको एक असफल डेटा लोड की डीबगिंग के घंटों बचेंगे।
सामान्य विशेष परिस्थितियाँ और वास्तविक सीमाएँ
सही उपकरणों के साथ भी, कुछ XLSX सुविधाएँ CSV की सरल दुनिया में सफाई से मैप नहीं होती हैं। यहाँ कुछ सामान्य जाल हैं। मर्ज किए गए सेल: Excel के मर्ज किए गए सेल एक विज़ुअल ट्रिक हैं। जब आप CSV में बदलते हैं, तो केवल मर्ज किए गए क्षेत्र के ऊपर-बाएँ सेल का मान ही बचता है; अन्य सेल खाली हो जाते हैं। स्पष्ट कर दें: इसका कोई साफ, स्वचालित समाधान नहीं है। आपको बदलने से *पहले* Excel में सेलों को अनमर्ज करना होगा (सब कुछ चुनें, Format → Cells → Alignment, Merge cells को अनचेक करें) और अब खाली सेलों को मैन्युअल रूप से भरना होगा। कई हेडर पंक्तियाँ: दो या तीन हेडर पंक्तियों वाली रिपोर्ट देखना आम है—एक मुख्य श्रेणी, एक उप-श्रेणी, और फिर वास्तविक कॉलम नाम। CSV पार्सर ठीक एक हेडर पंक्ति के लिए बनाए गए हैं। यह एक और मैन्युअल सफाई का काम है; आपको XLSX में हेडर को सरल बनाना होगा या उपयोगी होने से पहले CSV से अतिरिक्त पंक्तियों को हटाना होगा। सूत्र त्रुटियाँ: यदि Excel में एक सेल `#REF!`, `#DIV/0!`, या `#VALUE!` दिखाता है, तो वही टेक्स्ट आपके CSV में लिखा जाता है। वे स्ट्रिंग्स किसी भी संख्यात्मक कॉलम को दूषित कर देंगे और आयात के दौरान प्रकार की त्रुटियों का कारण बनेंगे। उन्हें पहले Excel में साफ करें, या तो स्रोत डेटा को ठीक करके या सूत्रों को `IFERROR()` फ़ंक्शन में लपेटकर। बहुत बड़ी फ़ाइलें: CocoConvert उदार है, मुफ्त में 50 MB तक और एक खाते के साथ 200 MB तक की फ़ाइलों को संभालता है। इससे बड़ी किसी भी चीज़ के लिए, एक ऑनलाइन टूल व्यावहारिक नहीं है। Python/pandas विधि पर स्विच करें या LibreOffice के कमांड-लाइन टूल (`libreoffice --headless --convert-to csv filename.xlsx`) का उपयोग करें। पासवर्ड-सुरक्षित XLSX फ़ाइलें: CocoConvert सहित कोई भी ऑनलाइन टूल पासवर्ड-सुरक्षित फ़ाइल नहीं खोल सकता है। आपको Excel में स्वयं पासवर्ड हटाना होगा (File → Info → Protect Workbook → Encrypt with Password), फ़ाइल को सहेजना होगा, और फिर इसे अपलोड करना होगा। छवियाँ और चार्ट: इन्हें चुपचाप छोड़ दिया जाता है। वे CSV प्रारूप में मौजूद ही नहीं होते हैं। यदि आपकी शीट ज्यादातर एक छोटे डेटा टेबल के साथ एक चार्ट थी, तो चार्ट हवा में गायब हो जाएगा, केवल टेक्स्ट को छोड़कर। यह कोई त्रुटि नहीं है, बस CSV की एक मौलिक सीमा है।