हिन्दी

डेटा और स्प्रेडशीट · CSV क्लीनर

कैसे एक CSV पार्सर फ़ील्ड में उद्धरण, एंबेडेड कॉमा और न्यूलाइन को संभालता है

· यह काम किस प्रकार करता है

CAसवी पदच्छेद डेटा-प्रारूप

फ़ील्ड के अंदर उद्धृत अल्पविराम, दोहरे उद्धरण चिह्न और एम्बेडेड लाइन ब्रेक को ध्यान में रखते हुए एक पार्सर स्थिति पथ
मूल ToolAcre वेक्टर चित्रण

अल्पविराम पर विभाजन तब तक काम करता है जब तक कि किसी फ़ील्ड में अल्पविराम, उद्धरण या पंक्ति विराम न हो। यह पोस्ट वास्तविक CSV पार्सर द्वारा उपयोग की जाने वाली छोटी राज्य मशीन के बारे में बताती है, उद्धरण नियम क्यों मौजूद हैं, और उद्धरण टूटने पर मरम्मत टूल क्या करता है।

अल्पविराम के साथ एक पता फ़ील्ड प्रत्येक कॉलम को दाईं ओर स्थानांतरित कर दिया गया है - क्यों अनुभवहीन विभाजन पार्सिंग नहीं कर रहा है

जैसे ही डाक पते, नोट या उत्पाद विवरण में वह वर्ण शामिल होता है, प्रत्येक अल्पविराम पर एक पंक्ति को विभाजित करना विफल हो जाता है। विभाजक केवल फ़ील्ड को समाप्त करता है जबकि पार्सर उद्धृत फ़ील्ड के बाहर होता है। उद्धरण चिह्नों के अंदर, वही बाइट मान से संबंधित है और उसे बिना किसी बदलाव के पूर्वावलोकन तक पहुंचना चाहिए।

ToolAcre यह मानने के बजाय परीक्षणों से इसे सिद्ध करता है कि CSV सरल पाठ है। उद्धृत नोट्स के अंदर अल्पविराम वाली अर्धविराम फ़ाइल को अभी भी अर्धविराम-सीमांकित के रूप में पहचाना जाता है क्योंकि प्रत्येक उम्मीदवार को उसके आयताकार आकार का स्कोर करने से पहले पंक्तियों में पार्स किया जाता है। अपरिष्कृत विराम चिह्न कभी भी बोली का निर्णय नहीं करते।

उद्धरण नियम - सीमांकक, उद्धरण या न्यूलाइन वाले फ़ील्ड दोहरे उद्धरण चिह्नों में लपेटे जाते हैं, और आंतरिक उद्धरण दोगुने होते हैं

क्रमांकन के दौरान चयनित सीमांकक, दोहरा उद्धरण, लाइन फ़ीड या कैरिएज रिटर्न वाला फ़ील्ड उद्धृत किया जाता है। किसी उद्धृत फ़ील्ड के अंदर एक शाब्दिक दोहरा उद्धरण दो आसन्न उद्धरणों द्वारा दर्शाया जाता है। पार्स करने पर, वह जोड़ी सेल में एक उद्धरण योगदान करती है और फ़ील्ड को बंद नहीं करती है।

उद्धरण केवल एक उद्धृत स्थिति को खोलते हैं जब वे अन्यथा खाली फ़ील्ड की शुरुआत में दिखाई देते हैं। 12" पाइप जैसे गैर-उद्धृत मान में, उद्धरण शाब्दिक डेटा रहता है। उस कार्यान्वयन विकल्प का परीक्षण किया जाता है और पाठ के बीच में माप चिह्न को बाद के कॉलमों को निगलने से रोकता है।

एक राज्य मशीन के रूप में एक पार्सर - अंदर-उद्धरण बनाम बाहरी-उद्धरण, और एक समय में एक चरित्र कैसे तय करता है कि फ़ील्ड कहाँ समाप्त होती है

कोर लूप वर्तमान फ़ील्ड, वर्तमान पंक्ति और `inQuotes` स्थिति को ट्रैक करता है। उद्धरण चिह्नों के बाहर, सीमांकक एक फ़ील्ड को धकेलता है और CR, LF या CRLF एक पंक्ति को धकेलता है। उद्धरण चिह्नों के अंदर, एक उद्धरण को छोड़कर प्रत्येक वर्ण जोड़ा जाता है, जो या तो एक बची हुई जोड़ी बनाता है या उद्धृत स्थिति से बाहर निकलता है।

यह एक-वर्ण प्रगति बताती है कि एक साधारण नियमित अभिव्यक्ति या रेखा विभाजन नाजुक क्यों है। कोई नई पंक्ति किसी रिकॉर्ड को समाप्त करती है या नहीं यह पहले के इनपुट पर निर्भर करता है, और क्या कोई उद्धरण फ़ील्ड को बंद करता है यह अगले उद्धरण पर निर्भर करता है। पार्सर स्ट्रिंग के माध्यम से ठीक उसी न्यूनतम स्थिति को वहन करता है।

एंबेडेड न्यूलाइन्स - एक पंक्ति कई पंक्तियों तक क्यों फैल सकती है और क्यों लाइन-आधारित टूल जैसे कि grep या wc मिसकाउंट रिकॉर्ड

एक उद्धृत फ़ील्ड में LF, CRLF या एक अकेला CR हो सकता है, और वे वर्ण मान के अंदर रहते हैं। नतीजतन, एक तार्किक रिकॉर्ड एक टेक्स्ट एडिटर में कई डिस्प्ले लाइनों पर कब्जा कर सकता है। लाइन-ओरिएंटेड कमांड के साथ भौतिक लाइनों की गिनती आवश्यक रूप से डेटा पंक्तियों की गिनती नहीं करती है।

समापन उद्धरण के बाद, अगला सीमांकक या रिकॉर्ड अंत संरचनात्मक अर्थ को फिर से शुरू करता है। ToolAcre के परीक्षण एम्बेडेड LF और एम्बेडेड CRLF दोनों का दावा करते हैं, फिर सत्यापित करते हैं कि केवल एक पंक्ति का उत्पादन किया गया था। यह व्यवहार RFC लेबल से अनुमानित नहीं है; इसका प्रयोग सीधे शिप की गई राज्य मशीन द्वारा किया जाता है।

टूटा हुआ उद्धरण - असंतुलित उद्धरण जो शेष फ़ाइल को निगल जाता है, और कैसे एक मरम्मत टूल फ़ील्ड को लगातार पुन: उद्धृत करता है

रूपरेखा में उद्धरण मरम्मत का वादा किया गया था, लेकिन एक खुला उद्धरण स्वाभाविक रूप से अस्पष्ट है। ToolAcre उस पंक्ति के विरुद्ध `UNCLOSED_QUOTE` रिपोर्ट करता है जहां उद्धृत स्थिति शुरू होती है और बाद में सब कुछ एक फ़ील्ड में पढ़ता है। यह किसी समापन स्थिति का आविष्कार नहीं करता है या इच्छित रिकॉर्ड को दोबारा उद्धृत नहीं करता है।

वह रूढ़िवादी विफलता उपभोग किए गए पाठ को निरीक्षण के लिए संरक्षित करती है और यह जानने का दिखावा करने से बचती है कि क्या बाद के उद्धरण या नई पंक्ति को डेटा के रूप में माना गया था। स्रोत को ठीक करें या निर्यात को पुन: उत्पन्न करें, फिर पुनः लोड करें। क्रमांकन सफलतापूर्वक पार्स की गई तालिका को सामान्य कर सकता है; यह पंक्ति सीमाओं को पुनर्प्राप्त नहीं कर सकता है, जिससे विकृत स्रोत अज्ञात हो गया है।

टूटे हुए उद्धरण की सूचना दी गई है लेकिन मरम्मत नहीं की गई है; एक बंद फ़ील्ड शेष पाठ का उपभोग करती है

हेडर के रूप में `name,note` का उपयोग करें, फिर एक पंक्ति Ada के साथ और एक नोट जिसमें अल्पविराम और एक पंक्ति विराम है, और दूसरा जिसका नोट `She said "hi"` है। स्रोत CSV में, लंबे नोट को उद्धृत करें और आंतरिक उद्धरण चिह्न को `""hi""` के रूप में लिखें। पार्सर दो डेटा पंक्तियाँ लौटाता है और दोनों विशेष वर्ण रखता है।

जब न्यूनतम उद्धरण के साथ क्रमबद्ध किया जाता है, तो सादे नामों को उद्धरण की आवश्यकता नहीं होती है, जबकि नोट फ़ील्ड उद्धृत किए जाते हैं क्योंकि उनमें संरचनात्मक वर्ण होते हैं। उस आउटपुट को पार्स करने से फिर से वही हेडर और सेल मिलते हैं, भले ही अनावश्यक स्रोत उद्धरण गायब हो गए हों। डेटा समानता, बाइट-फॉर-बाइट स्टाइलिंग नहीं, इस राउंड ट्रिप को परिभाषित करती है।

इसमें क्या शामिल नहीं है - वे बोलियाँ जो बैकस्लैश एस्केप का उपयोग करती हैं, और उद्धृत करते समय इरादे का अनुमान लगाने के लिए अनुमान वास्तव में अस्पष्ट हैं

बैकस्लैश एस्केप बोलियाँ पार्सर के बाहर हैं। उद्धरण से पहले बैकस्लैश का यहां कोई विशेष राज्य-मशीन अर्थ नहीं है; यह पाठ बना रहता है, जबकि उद्धरण की व्याख्या दोहरे-उद्धरण नियमों के तहत की जाती है। एक बार शुरुआती उद्धरण बेजोड़ रहने पर टूल इरादे का अनुमान लगाने से भी इनकार कर देता है।

किसी अन्य एस्केप कन्वेंशन के लिए कॉन्फ़िगर किए गए डेटाबेस डंप को आयात करते समय वे सीमाएँ मायने रखती हैं। लोड करने से पहले निर्माता की बोली पहचानें, या RFC-शैली उद्धरण के साथ निर्यात करें। एक पार्सर जो चुपचाप कई असंगत एस्केप नियमों को पहचानता है, शाब्दिक बैकस्लैश को नियंत्रण वाक्यविन्यास में बदल सकता है और एक बेमेल को छुपा सकता है।

उद्धरणों और पंक्तियों का सम्मान बरकरार रखें - कैसे ToolAcre CSV क्लीनर की उद्धरण मरम्मत एक फ़ाइल तैयार करती है जिसे मानक पार्सर सही ढंग से पढ़ते हैं

उद्धृत स्थिति का सम्मान करते हुए सीमांकक और रिकॉर्ड अंत को उन कोशिकाओं के अंदर रखा जाता है जहां वे हैं। ToolAcre तीन लाइन-एंडिंग फॉर्म को भी संभालता है, एक अग्रणी UTF-8 BOM को हटाता है और पंक्ति-चौड़ाई बेमेल की रिपोर्ट करता है। ये व्यवहार खोज-और-प्रतिस्थापन युक्तियों के संग्रह के बजाय एक संरचनात्मक रीड के स्वतंत्र भाग हैं।

एक वैध पार्स के बाद, क्रमबद्धता एम्बेडेड उद्धरणों को दोगुना कर देती है और सुरक्षा की आवश्यकता वाले किसी भी फ़ील्ड को डिफ़ॉल्ट रूप से CRLF आउटपुट के साथ उद्धृत करती है। अमान्य अप्रयुक्त उद्धरण के बाद, रोकें और स्रोत साक्ष्य से मरम्मत करें। टूल ज्ञात कोशिकाओं को मानकीकृत कर सकता है; यह किसी अज्ञात तालिका के पुनर्निर्माण का दावा नहीं करता है।