एक अल्पविराम CSV फ़ाइलों में अल्पविराम विभाजक / सीमांकक क्यों है?


32

मैं इस लेख को पढ़ रहा था और इस प्रश्न के उचित उत्तर के लिए उत्सुक हूं।

केवल एक चीज जो मेरे दिमाग में आती है, वह शायद यह है कि कुछ देशों में दशमलव विभाजक एक अल्पविराम है, और सीएसवी में डेटा साझा करते समय यह समस्याएं हो सकती हैं , लेकिन मैं वास्तव में अपने उत्तर के बारे में निश्चित नहीं हूं।


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

33
एक सनकी, इस लेख को एसएएस कश टुकड़ा है, यह देखते हुए कि शायद एसएएस को कम्यूटर के साथ सीएसवी फ़ाइलों को संसाधित करने में समस्या हो सकती है।
whuber

3
@whuber - SAS (मेरे अनुभव में) CSV फ़ाइलों के साथ संघर्ष कर सकता है, चाहे उनके पास अल्पविराम हो या न हो, हर उस अजीब चीज़ के लिए भारी मात्रा में हाथ कोडिंग की आवश्यकता होती है जो SAS को पसंद नहीं है।
जेरेमी मील्स

8
कभी-अधिक-अस्पष्ट सीमांकक की खोज में एक हताशा होती है - पाइप, पाइलक्रॉस, कांटे - जो यह मानते हैं कि मानक पर सहमत होना और एक मानक का पालन करना वास्तव में लोगों के लिए सीमांकित पाठ फ़ाइलों में डेटा का आदान-प्रदान करने का एकमात्र सुरक्षित तरीका है। और एक सार्वभौमिक मानक को किसी भी पाठ स्ट्रिंग का प्रतिनिधित्व करने की अनुमति है (जैसा कि RFC4180 करता है), इस धारणा पर निर्भर होने के बजाय कि कुछ को अन्य कार्यों में लगाने की आवश्यकता नहीं हो सकती है।
Scortchi - को पुनः स्थापित मोनिका

2
(a) मैंने अक्सर .csv फ़ाइलों को सफलतापूर्वक आयात किया है। (b) मैं लोगों को सलाह देता हूं कि यदि उनके डेटा में कॉमा हैं तो .csv का उपयोग न करें। ये एक दूसरे के विपरीत नहीं हैं। यह दुर्भाग्यपूर्ण है कि (बी) को कुछ तिमाहियों में स्पष्टीकरण की आवश्यकता है।
निक कॉक्स

जवाबों:


33

CSV प्रारूप विनिर्देश RFC 4180 में परिभाषित किया गया है । यह विनिर्देश प्रकाशित किया गया था क्योंकि

अस्तित्व में कोई औपचारिक विनिर्देश नहीं है, जो सीएसवी फ़ाइलों की विस्तृत विविधता की अनुमति देता है

दुर्भाग्य से, 2005 (आरएफसी प्रकाशित करने की तारीख) के बाद से, कुछ भी नहीं बदला है। हमारे पास अभी भी कई प्रकार के कार्यान्वयन हैं। RFC 4180 में परिभाषित सामान्य दृष्टिकोण है कि उद्धरण चिह्नों में अल्पविराम जैसे वर्णों वाले क्षेत्रों को शामिल करना है, लेकिन यह सिफारिश हमेशा अलग-अलग सॉफ़्टवेयरों से नहीं मिलती है।

समस्या यह है कि विभिन्न यूरोपीय स्थानों में अल्पविराम चरित्र दशमलव बिंदु के रूप में कार्य करता है, इसलिए आप 0,005इसके बजाय लिखते हैं 0.005। फिर भी अन्य मामलों में, अंकों के समूहों को संकेत देने के लिए रिक्त स्थान के बजाय अल्पविराम का उपयोग किया जाता है, उदाहरण के लिए 4,000,000.00( यहाँ देखें )। दोनों मामलों में शायद कॉमा का उपयोग करने से सीएसवी फाइलों के डेटा को पढ़ने में त्रुटियां हो सकती हैं क्योंकि आपका सॉफ्टवेयर वास्तव में नहीं जानता है कि 0,005, 0,1क्या दो नंबर या चार अलग-अलग नंबर हैं ( उदाहरण देखें यहां )।

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

कुछ भी नहीं अल्पविराम बेहतर या बदतर क्षेत्र विभाजक बनाता है जहाँ तक CSV फ़ाइलों का उपयोग RFC 4180 की सिफारिशों के अनुसार किया जाता है जो ऊपर वर्णित समस्याओं से बचाता है। हालाँकि, यदि सरलीकृत CSV प्रारूप का उपयोग करने का जोखिम है जो उद्धरण चिह्नों में फ़ील्ड्स को सम्मिलित नहीं करता है, या अनुशंसा को असंगत रूप से उपयोग किया जा सकता है, तो अन्य विभाजक (जैसे अर्धविराम) सुरक्षित दृष्टिकोण प्रतीत होते हैं।


6
RFC 4180 द्वारा परिभाषित वास्तविक CSV मानक को लागू करने वाला कोई भी सॉफ्टवेयर निश्चित रूप से किसी भी दिए गए स्ट्रिंग की व्याख्या करने का तरीका निश्चित रूप से जानता होगा। एक तर्क ,विभाजक के बजाय का उपयोग करने वाला तर्क डेटा को दोष देता है क्योंकि आपको इसे हर समय बचना होगा, हालांकि यह सच है। और जाहिर है कि वे सभी लोग हैं जो सोचते हैं कि वे जानते हैं कि CSV कैसे काम करता है लेकिन वास्तव में ऐसा नहीं है।
वू

2
@Voo हाँ, लेकिन क्योंकि "सीएसवी" फ़ाइलों का उपयोग इस तरह के अराजक तरीके से किया जाता है, यह अल्पविराम का उपयोग नहीं करने के लिए सुरक्षित है और इसके बजाय अन्य विभाजक, जैसे अर्धविराम का उपयोग करते हैं। यह ओपी सवाल का जवाब है। अल्पविरामों की तुलना में अर्धविराम (या अन्य गैर-कॉमा) में "बेहतर" कुछ भी नहीं है, वे कई मामलों में बस सुरक्षित विकल्प हैं।
टिम

2
@Voo +1 अपनी टिप्पणी के लिए। हालाँकि, जो कोई भी CSV का उपयोग कर रहा है वह वास्तव में फूला हुआ डेटा फ़ाइलों की परवाह नहीं करता है!
व्हिबर

17

तकनीकी रूप से अल्पविराम किसी भी अन्य वर्ण के रूप में उतना ही अच्छा है जितना कि एक विभाजक के रूप में उपयोग किया जाए। प्रारूप का नाम सीधे संदर्भित करता है कि मान अल्पविराम से अलग हैं (कॉमा-सेपरेटेड वैल्यूज़)।

CSV प्रारूप का वर्णन अल्पविराम को विभाजक के रूप में उपयोग कर रहा है।

अल्पविराम युक्त कोई भी क्षेत्र डबल-उद्धृत होना चाहिए। ताकि डेटा पढ़ने में समस्या न हो। विवरण से बिंदु 6 देखें :

  1. लाइन विराम (CRLF), दोहरे उद्धरण चिह्नों और अल्पविराम वाले फ़ील्ड को दोहरे उद्धरणों में संलग्न किया जाना चाहिए।

उदाहरण के लिए फ़ंक्शन read.csvऔर write.csvR से डिफ़ॉल्ट रूप से अल्पविराम को विभाजक के रूप में उपयोग कर रहे हैं।


4
यह सबसे अच्छा उत्तर है, क्योंकि यह संदर्भित है valuesकि अल्पविराम अलग हो गए हैं। formattingसंख्याओं की यूरोपीयता के लिए अन्य लोग , यह सीएसवी के लिए एक मुद्दा नहीं है standard, जैसा कि आप ऊपर बिंदु 6 को सही ढंग से उद्धृत करते हैं। "सही उपयोग" से डायवर्जेंस किसी भी डेटा प्रारूप के साथ मौजूद हैं। बिंदु है - अपने डेटा को जानें। अन्य लोग उल्लेख करते हैं tabया ;सीमांकित करते हैं, हालाँकि ये वही मुद्दे हो सकते हैं जब आप डेटा के साथ काम कर रहे होते हैं, जो उपयोगकर्ता द्वारा दर्ज किया जाता है (शायद एक फॉर्म के माध्यम से और एक डेटाबेस द्वारा कैप्चर किया गया - मुझे मुफ्त टेक्स्ट एंट्री फ़ील्ड्स से जूझना पड़ता है जो लोग वसा में उँगलियाँ है tab... यह बेकार है)
एड्रियन टॉरी

टिम के जवाब को अब @djhurio द्वारा दी गई जानकारी को शामिल करने के लिए संपादित किया गया है।
एड्रियन टॉरी

11

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


2
(+1) मानक डेटा के भाग के रूप में दोहरे उद्धरण चिह्नों के उपयोग के लिए उन्हें फिर से दोगुना करने के लिए प्रदान करता है: "बेलोक", "टारेंटेला", "" पिस्स जो हाई पाइरेनीज़ में चिढ़ता है ""। इंग्लैंड में, उद्धरण में एक घर के नाम वाले पते फ़ील्ड को खोजना असामान्य नहीं है, इस प्रकार: "चैटस्वर्थ", मेल्टन रोड, लेमिंगटन। (यह स्पष्ट है क्यों नहीं: फाउलर शिकायत है कि "निहितार्थ लगता है: घर कि समझदार लोगों को '164 मेल्टन रोड' कहते हैं में रहने वाले हैं, लेकिन एक मूर्ख 'चैट्सवर्थ' कॉल करने के लिए पसंद करती है"।)
Scortchi - को पुनः स्थापित मोनिका

1
@Scortchi ऐसा लगता है कि हमने 12 साल की उम्र (+/- त्रुटि) में एक ही कविता सीखी। मुझे डर है कि मैंने 20 वीं शताब्दी के शुरुआती दिनों में दुर्भाग्यपूर्ण के रूप में पढ़ा था, जो निम्न मध्यम वर्ग की आदतों के लिए उच्च मध्यम वर्ग की अंग्रेजी स्नोबेरी आपके अंतिम उदाहरण को अस्पष्ट करता है, जो एक छोटे समूह से परे पारदर्शी नहीं होगा।
निक कॉक्स

@ न्यूकॉक्स: राइट के बारे में बारह ध्वनियाँ। मजेदार बात यह है कि मुझे याद नहीं है कि मैंने इस साल कोई कविता पढ़ी है या नहीं , चलो उनमें से किसी भी पंक्ति को याद करते हैं। हालाँकि फाउलर की बात अनावश्यक उद्धरण चिह्नों के पाठक पर प्रभाव के बारे में थी ( अनावश्यक रूप से देखें। ), मुझे लगता है कि उदाहरण के लिए उनकी पसंद में स्नोबेरी के प्रभाव को देखना सही है। किसी भी दर पर, मुझे आशा है कि इसके बजाय मामूली बात यह है कि यह देखने के लिए कुछ है कि क्या आपको कभी सीएसवी फ़ाइल भेजी जाती है जिसमें अंग्रेजी पते होते हैं जो मेरे विभाजन के बावजूद सभी के लिए स्पष्ट है।
Scortchi - को पुनः स्थापित मोनिका

1
भारत में, यह उन लोगों के लिए आम है जो अपने पहले घरों का निर्माण करते हैं (अपार्टमेंट नहीं), एक अभिनव फूलों का नाम रखने के लिए, अक्सर एक अलौकिक भाषा या संस्कृत वाक्यांश में और वे दोहरे उद्धरण चिह्नों में होते हैं, जैसे "गुरु कृपा"। जेनेलिया डिसूजा और डेरेक ओ'ब्रायन जैसे नाम भी आम हैं। फिर, पते कहते हैं कि "पुराने डोर नं। एनएनएन / न्यू डोर नं। एमएम / सी", सरकार द्वारा पुनः पता लगाने के कारण पते के संग्रहण को और भी अधिक जटिल कर दिया गया है, जिसमें अप्रत्याशित कोनों में स्लैश और सिंगल कोट्स हैं।
व्हर्ल माइंड

@WhirlMind: यह दिलचस्प है - मैंने बहुत कुछ देखा है - ठीक है, जितना मैं उम्मीद करूंगा - इंग्लैंड में स्कॉटिश गेलिक और वेल्श घर के नाम, जो शायद आपके घर का नाम रखने के लिए एक शाब्दिक भाषा चुनने के लिए निकटतम समकक्ष है।
Scortchi - को पुनः स्थापित मोनिका

9

जबकि @Tim का उत्तर सही है - मैं जोड़ना चाहूंगा कि "csv" के रूप में एक पूरी तरह से कोई सामान्य मानक नहीं है - विशेष रूप से भागने के नियमों को बिल्कुल भी परिभाषित नहीं किया गया है, जिससे "प्रारूप" एक कार्यक्रम में पढ़ने योग्य हैं, लेकिन दूसरे नहीं । यह इस तथ्य से स्पष्ट है कि सूरज के नीचे प्रत्येक "प्रोग्रामर" सिर्फ "ऊऊह सीएसवी- मैं अपना खुद का पार्सर बनाऊंगा!" और फिर किनारे के सभी मामलों को याद करता है।

इसके अलावा, सीएसवी पूरी तरह से मेटाडेटा या यहां तक ​​कि एक कॉलम के डेटा प्रकार को संग्रहीत करने की क्षमता का अभाव है - कई दस्तावेजों पर अग्रणी है जिन्हें आपको डेटा को समझने के लिए पढ़ना चाहिए।


5
हां, मानक उपकरण है ।ietf.org/html/rfc4180 और कई अन्य प्रारूप किसी भी मेटाडेटा को संग्रहीत नहीं करते हैं, यह सिर्फ मेटाडेटा संग्रहीत करने के लिए डिज़ाइन नहीं किया गया है - .txt फ़ाइलें भी पाठ दस्तावेज़ों के बारे में मेटाडेटा संग्रहीत नहीं करती हैं ...
टिम

4
टिम, उस मानक को अधिक बार नजरअंदाज नहीं किया जाता है, इसे गैर-मानक बना दिया जाता है ,,,
क्रिश्चियन सॉयर

8
मानकों के बारे में महान बात यह है कि इसमें से चुनने के लिए बहुत सारे हैं। (विभिन्न रूप से उत्परिवर्तित और आरोपित।)
निक कॉक्स

4

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


5
यदि आपके डेटा में टैब हैं, तो कॉनसेटर लागू होता है। यह सिर्फ, कम से कम मेरे अनुभव में, कम संभावना है।
निक कॉक्स

@ निक और गोरिल्ला: मेरे पास |होम-पीस्ड सीएसवी जैसे रिकॉर्ड की टेक्स्ट फाइल (पुस्तक के शीर्षक और अन्य दस्तावेज मेटाडेटा के साथ) के परिसीमन के रूप में अच्छे परिणाम हैं । |मेरे साथ काम करने वाले डेटा में कभी नहीं होता है, इसलिए मैं केवल पर्ल स्क्रिप्ट लिख सकता हूं जो किसी भी प्रकार के उद्धरण के लिए जाँच के बिना बस विभाजित / जुड़ जाते हैं। यह एक एकल-परियोजना के लिए था जिसमें सिर्फ MS एक्सेस डेटाबेस से सहेजे गए मेटाडेटा को संसाधित करना शामिल है। किसी भी बड़ी परियोजना के लिए, या यदि आप इस फ़ाइल-प्रारूप में डेटा को लंबे समय तक रखने की योजना बना रहे हैं, तो कुछ अधिक मजबूत चुनें! मैं हमेशा कुछ ट्विस्ट कर सकता था अगर इस महीने का बैच कुछ तोड़ता।
पीटर कॉर्डेस

@PeterCordes मुझे विश्वास है, और जो भी काम करता है। लेकिन स्पष्ट रूप से idiosyncratic विभाजक की लागत उन लोगों को दूसरों को समझाने की आवश्यकता हो सकती है और यह महत्वपूर्ण है कि वे बिना किसी कठिनाई के ऐसी डेटा फ़ाइलों को आयात कर सकते हैं। एक असामान्य फ़ाइल प्रारूप के साथ सामना करने के लिए, कुछ दिनचर्या, फ़ंक्शन या कमांड तक पहुंच होना आवश्यक है जो मनमाने ढंग से विभाजकों पर तारों को विभाजित कर सकते हैं।
निक कॉक्स

@PeterCordes जब मैंने splitस्टाटा के लिए एक आदेश लिखा , तो मैंने देखा, अन्य चीजों के अलावा, पर्ल ने यह देखने के लिए बराबर किया कि यह क्या किया और क्या नहीं किया। स्रोत कोड नहीं, बस कार्यक्षमता की पेशकश की।
निक कॉक्स

1
@ नाइकॉक्स: पर्ल के बहुत सारे कार्य काफी अच्छी तरह से डिज़ाइन किए गए हैं, आईएमओ। वे बहुत सी विशेष सीमाओं के बिना काम करते हैं जैसे आप जाग में पाते हैं (जो अक्सर अच्छा होता है), या जासूसी। अन्य यूनिक्स उपकरण की तरह है cut, sortऔर uniq
पीटर कॉर्डेस

4

ASCII हमें चार "विभाजक" अक्षर प्रदान करता है, जैसा कि अस्सी (7) * निक्स मैन पेज से स्निपेट में नीचे दिखाया गया है:

   Oct   Dec   Hex   Char
   ----------------------
   034   28    1C    FS  (file separator)
   035   29    1D    GS  (group separator)
   036   30    1E    RS  (record separator)
   037   31    1F    US  (unit separator)

यह उत्तर उनके इच्छित उपयोग का एक सभ्य अवलोकन प्रदान करता है।

बेशक, इन नियंत्रण कोडों में अधिक लोकप्रिय सीमांकक की मानव-मित्रता (पठनीयता और इनपुट) का अभाव है, लेकिन कार्यक्रमों के बीच डेटा के आंतरिक और / या अल्पकालिक विनिमय के लिए स्वीकार्य विकल्प हैं।


2
दिलचस्प। मुझे नहीं लगता कि मैंने कभी भी इनका उपयोग जंगली में देखा है ...
मैट क्राउज़

4

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

RFC 4180 मानक का पालन करना सबके लिए सब कुछ सरल बनाता है।

मुझे व्यक्तिगत रूप से एक प्रोग्राम से आउटपुट को ठीक करने के लिए एक स्क्रिप्ट लिखना पड़ा है जो इस गलत मिला, इसलिए मैं इसके बारे में थोड़ा उग्रवादी हूं। "शायद ठीक करें" का अर्थ है कि यह मेरे डेटा के लिए काम करता है, लेकिन मैं ऐसी स्थितियों को देख सकता हूं जहां यह विफल हो जाएगा। (उस कार्यक्रम की रक्षा में, यह मानक से पहले लिखा गया था।)

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.