कम से कम <text> ASCII 128


81

कोडिंग कारणों से जो आपको भयभीत करेगा (मैं कहने में बहुत शर्मिंदा हूं), मुझे एक ही स्ट्रिंग में कई टेक्स्ट आइटम संग्रहीत करने की आवश्यकता है।

मैं एक चरित्र का उपयोग करके उनका परिसीमन करूंगा।

इसके लिए कौन सा चरित्र उपयोग करना सबसे अच्छा है, अर्थात पाठ में कौन सा चरित्र दिखाई देने की संभावना सबसे कम है? स्थानीय मुद्दों से बचने के लिए ASCII में मुद्रण योग्य और संभवतः 128 से कम होना चाहिए।


44
कृपया अवतरित न हों। आपको उन सभी लोगों को अनदेखा करना चाहिए जो कहते हैं "ऊह, यह बकवास तरीका है, इसके बजाय ऐसा करें"। यह उत्तरदाताओं के लिए सवाल करने के लिए नहीं है, यह उनके लिए कि कैसे जवाब दें। मुझे परवाह नहीं है कि आप इस स्थिति में क्यों हैं। मैं खुद कुछ में रहा हूं। सौभाग्य!
इयान होल्डर

1
मेरे पास यही मुद्दा था..और मैं गुगली या स्टैक ओवरफ्लो होने से पहले PIPE के साथ गया था ... क्योंकि मुझे यह दिखने में पसंद था --- | ---- एक चमड़ी वाले व्यक्ति की तरह।

1
यह पाठ के प्रकार पर निर्भर करता है। कुछ प्रकार के पाठ शायद ही कभी टैब वर्णों का उपयोग करते हैं इसलिए मैं अक्सर इसके साथ जाता हूं। लेकिन स्रोत कोड सहित अन्य प्रकार के पाठ अक्सर इसका उपयोग करते हैं। क्या आप अपने स्रोत पाठ पर कुछ आँकड़े नहीं कर सकते हैं? क्या आप अपने स्रोत टेक्स्ट में एस्केप कैरेक्टर नहीं जोड़ सकते हैं और इस तरह से आप कुछ भी इस्तेमाल कर सकते हैं?
हिप्पिएट्रैल

किसी भी तरह का सवाल पूछने से शर्मिंदा होने की तुलना में कोशिश करना और न करना बहुत बुरा है। मैं यहाँ उसी प्रश्न के उत्तर के लिए हूँ और मुझे अपने आप पर गर्व है कि मेरे पास कुछ अन्य लोग भी मेरे साथ एक ही समस्या साझा कर रहे हैं :)
Teoman shipahi

उन लोगों के लिए जो |अपने पाठ में हो सकते हैं , मेरे पास वास्तव में ऐसा मामला था जहां मुझे वर्णों को यथासंभव न्यूनतम रखने की आवश्यकता थी। अधिकांश क्षेत्रों में जहां दिलचस्प पाठ के साथ तार, CSV बहुत भागने के कारण काम नहीं किया। हमारा क्षेत्र परिसीमन है /|। स्लेश केवल सामान्य रूप से सामान्य है लेकिन एक पाइप के साथ जोड़ा जाता है जिसे आप कभी नहीं चलाते हैं। मैं एक ऐसे इंजन का उपयोग कर रहा हूं, जो हर दिन बहुत से डेटा से गुजरता है। यह कभी नहीं टूटा है, और मुझे कभी भी एक स्ट्रिंग को एनकैप्सुलेट करने या विशेष चार से बचने की आवश्यकता नहीं है। औसतन, इस तंत्र ने हमें कुछ प्रतिशत पाठ बचाया है।
RLH

जवाबों:


34

कुछ शर्मनाक कारणों के लिए मान लें कि आप CSV का उपयोग नहीं कर सकते, मैं कहता हूं कि डेटा के साथ जाना होगा। कुछ नमूना डेटा लें, और प्रत्येक मूल्य 0-127 के लिए एक साधारण वर्ण गणना करें। उनमें से एक चुनें जो घटित न हो। यदि बहुत अधिक विकल्प है तो एक बड़ा डेटा सेट प्राप्त करें। इसे लिखने में ज्यादा समय नहीं लगेगा, और आपको इसका उत्तर सबसे अच्छा मिलेगा।

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

मुझे व्यक्तिगत रूप से लगता है कि मैं इसके लिए जाऊंगा (पाइप) यदि कोई विकल्प दिया गया है लेकिन वास्तविक डेटा के साथ जाना सबसे सुरक्षित है।

और जो भी आप करते हैं, सुनिश्चित करें कि आपने एक भागने की योजना बनाई है!


मैं यहाँ हास्यास्पद नहीं जाऊँगा। एक Magento 2 उत्पाद निर्यात में, वे csv नामक एकल कॉलम में कई विशेषताओं को मिलाते हैं additional_attributes
स्टीफन

1
आप केवल चार स्थानों के साथ पाठ के सभी टैब वर्णों को प्रतिस्थापित क्यों नहीं करते हैं और \tसीमांकक के रूप में एक टैब वर्ण का उपयोग करते हैं ?
एली जी।

35

मैं "यूनिट सेपरेटर" ASCII कोड "US" चुनूंगा: ASCII 31 (0x1F)

पुराने, पुराने दिनों में, ज्यादातर चीजें क्रमिक रूप से की जाती थीं, बिना यादृच्छिक पहुंच के। इसका मतलब है कि कुछ नियंत्रण कोड ASCII में एम्बेड किए गए थे।

ASCII 28 (0x1C) File Separator - Used to indicate separation between files on a data input stream.
ASCII 29 (0x1D) Group Separator - Used to indicate separation between tables on a data input stream (called groups back then).
ASCII 30 (0x1E) Record Separator - Used to indicate separation between records within a table (within a group).  These roughly map to a tuple in modern nomenclature.
ASCII 31 (0x1F) Unit Separator - Used to indicate separation between units within a record.  The roughly map to fields in modern nomenclature.

यूनिट सेपरेटर ASCII में है, और इसे प्रदर्शित करने के लिए यूनिकोड समर्थन है (आमतौर पर एक ही ग्लिफ़ में "हमें") लेकिन कई फोंट इसे प्रदर्शित नहीं करते हैं।

यदि आप इसे प्रदर्शित करना चाहते हैं, तो मैं इसे खेतों में पार्स करने के बाद, इन-एप्लिकेशन को प्रदर्शित करने की सलाह दूंगा।


1
वाह धन्यवाद। यह वही था जो मैं खोज रहा था।
दून

22

शायद | या ^ या ~ आप दो वर्णों को भी मिला सकते हैं


10
एक ही दो बार उपयोग करने से किसी भी गलतफहमी को रोका जा सकेगा। की तरह || या ##
रोएल

17

विभिन्न भाषाओं का उपयोग करते समय, यह प्रतीक: this

सबसे अच्छा साबित हुआ। हालाँकि मैं अभी भी परीक्षण कर रहा हूँ।


1
मुझे यह विचार पसंद है, लेकिन अगर आप "बिली" ¬ "कार" ¬ "रेड" ¬ "गैरेज" ¬ "3" और कट का उपयोग करने वाले तार दर्ज करने में सक्षम हैं, तो मैं उत्सुक हूं। (यानी। $ कट -d "¬" -f1 myfile.delim)
ब्लोमैन

मैंने इस सवाल को यहाँ स्टैक करने के लिए जोड़ा: stackoverflow.com/questions/19821639/…
ब्लोमैन

15

आपने "प्रिंट करने योग्य" कहा, लेकिन इसमें टैब (0x09) या फ़ॉर्म फ़ीड (0x0c) जैसे वर्ण शामिल हो सकते हैं। मैं लगभग हमेशा सीमांकित फ़ाइलों के लिए कॉमा के बजाय टैब का चयन करता हूं, क्योंकि कॉमा कभी-कभी पाठ में दिखाई दे सकता है।

(दिलचस्प रूप से पर्याप्त एससीआई तालिका में समूह जीएस (0x1 डी), आरएस (0x1E), और यूएस (0x1F) के समूह, रिकॉर्ड और यूनिट विभाजक, जो कुछ भी हैं / हैं उनके वर्ण हैं।)

यदि "प्रिंट करने योग्य" से आपका मतलब एक ऐसे चरित्र से है जिसे एक उपयोगकर्ता पहचान सकता है और आसानी से टाइप कर सकता है, तो मैं पाइप के लिए जाऊंगा प्रतीक पहले, कुछ अन्य अजीब अक्षर के साथ ( @या ~या ^या \या बैकटिक जिसे मैंने यहां प्रवेश नहीं कर पा रहे) एक संभावना के रूप। इन पात्रों को +=!$%&*()-'":;<>,.?/लगता है कि उपयोगकर्ता इनपुट में उनके होने की संभावना अधिक होगी। अंडरस्कोर _और हैश #और कोष्ठक के लिए {}[]मुझे नहीं पता।


14
मानक ASCII कोड तालिका में इस उद्देश्य के लिए विशेष रूप से डिज़ाइन किए गए चार नियंत्रण कोड शामिल हैं, जैसा कि ऊपर जेसन एस ने उल्लेख किया है। वे हैं: 28 FSफाइल सेपरेटर, 29 GSग्रुप सेपरेटर, 30 RSरिकॉर्ड सेपरेटर, 31 USयूनिट सेपरेटर। दुर्भाग्य से, बहुत ज्यादा कोई भी उनका उपयोग नहीं करता है, हालांकि यह वही है जो वे चाहते थे। व्यक्तिगत रूप से मैं CSV प्रारूप फ़ाइलों का पता लगाता हूं क्योंकि इतने सारे लोग चीजों के बारे में नहीं सोचते हैं और एक गड़बड़ बनाते हैं कि हमें प्रोग्रामर से निपटना पड़ता है यदि हम उनके फ़ाइल स्वरूपों का समर्थन करना चाहते हैं।
deegee

3
@ डिजी यह शायद यहाँ सबसे अच्छा जवाब है। जब तक डेटा में बाइनरी या गैर-मानक एससीआई / यूनिकोड नहीं होता है तब तक यह हमेशा किसी भी भाषा में काम करेगा। आपको इसे नियमित उत्तर में बदलना चाहिए।
dhj

@ क्या आपके पास स्वीकृत उत्तर के रूप में इसे चिह्नित करने की शक्तियां हैं? रगड़ से भरा उपयोगकर्ता इनपुट डेटा के साथ काम करते समय सबसे उपयोगी। दूसरों पर ध्यान दें: विंडोज में US (0x1F) प्राप्त करने के लिए ALT + 31।
गोल्फटाल

14

आप CSV शैली प्रारूप का उपयोग कैसे करते हैं? वर्ण मानक CSV प्रारूप में बच सकते हैं, और पहले से ही पहले से लिखे गए बहुत सारे पार्सर हैं।


मुझे यह अपने विचार से बेहतर लगता है। +1।
आईन होल्डर

मुझे लगता है कि एक कॉमा सामान्य पाठ में सामान्य चरित्र के रूप में गिना जाता है। अगर यह CSV का उपयोग करने के रूप में सरल था, तो मुझे संदेह है कि सवाल पूछने की जरूरत होगी ...
Jay

सीएसवी सामान्य पाठ के साथ-साथ कुछ अन्य मुद्दों पर कॉमा से संबंधित है। तो यह कोई बात नहीं है कि पाठ में पहले से ही एक अल्पविराम है। IIRC यह उद्धरण में पाठ डालता है और उद्धरण से बच जाता है।
जेरेमी फ्रेंच

@ जेरेमी: बिल्कुल सही। यहाँ एक विकिपीडिया लेख है जिसमें बताया गया है कि पलायन योजना कैसे काम करती है: en.wikipedia.org/wiki/Comma-separated_values
rmeador

1
इसे स्पष्ट रूप से कहने के लिए: सीवीएस उन सभी मुद्दों से निपटेगा जिनके बारे में आपने नहीं सोचा था और सुनिश्चित करें कि आपको हर दो सप्ताह में अपने "समाधान" को ठीक नहीं करना होगा क्योंकि यह कुछ अप्रत्याशित इनपुट के कारण टूट जाता है।
आरोन दिगुल्ला

9

क्या आप एक पाइप प्रतीक का उपयोग कर सकते हैं? यह आमतौर पर कॉमा या टैब सीमांकित स्ट्रिंग्स के बाद अगला सबसे आम सीमांकक है। यह संभावना नहीं है कि अधिकांश पाठ में एक पाइप होगा, और ऑर्ड ('|') मेरे लिए 124 रिटर्न देता है, ताकि आपकी आवश्यकताओं को पूरा करने के लिए ऐसा लगता है।


8

तेजी से भागने के लिए, मैं इस तरह से सामान का उपयोग करता हूं: कहते हैं कि आप str1, str2 और str3 को संक्षिप्त करना चाहते हैं जो मैं करता हूं:

delimitedStr=str1.Replace("@","@a").Replace("|","@p")+"|"+str2.Replace("@","@a").Replace("|","@p")+"|"+str3.Replace("@","@a").Replace("|","@p");

फिर मूल उपयोग को पुनः प्राप्त करने के लिए:

splitStr=delimitedStr.Split("|".ToCharArray());
str1=splitStr[0].Replace("@p","|").Replace("@a","@");
str2=splitStr[1].Replace("@p","|").Replace("@a","@");
str3=splitStr[2].Replace("@p","|").Replace("@a","@");

नोट: प्रतिस्थापित का क्रम महत्वपूर्ण है

इसके अटूट और लागू करने में आसान है


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

परिसीमन काफी अप्रासंगिक नहीं है। यदि आप एक सामान्य चरित्र को चुनते हैं - एक स्थान या अक्षर "ई" कहें - आपका बचा हुआ स्ट्रिंग वास्तव में काफी लंबा होने वाला है, और पढ़ने में कठिन है। एक असामान्य चरित्र चुनने के लिए सबसे अच्छा है, यही कारण है कि मैं अभी भी इस तरह की चीज के लिए पाइप प्रतीक को पसंद करता हूं।
मूर्ख 4


2

हम ascii 0x7f का उपयोग करते हैं जो छद्म मुद्रण योग्य है और शायद ही कभी नियमित उपयोग में आता है।


2

यह स्थिति या भाषा के आधार पर अच्छा या बुरा (आमतौर पर बुरा) हो सकता है, लेकिन इस बात का ध्यान रखें कि आप हमेशा पूरी बात को आधार बना सकते हैं। फिर आपको प्रत्येक पक्ष पर विभिन्न पैटर्नों के भागने और उनके बारे में चिंता करने की ज़रूरत नहीं है, और आप बस एक चरित्र के आधार पर स्ट्रिंग्स को अलग और विभाजित कर सकते हैं जिसका उपयोग आपके बेस 64 चार्ट में नहीं किया गया है।

XML गुणन / नोड्स में XML दस्तावेज लगाने के साथ सामना करने पर मुझे इस समाधान का सहारा लेना पड़ा है। प्रॉपर्टीज में सीडीएटीए ब्लॉक बिल्कुल नहीं हो सकते हैं, और नोड्स सीडीएटीए के रूप में बच गए हैं, जाहिर है कि संरचना को तोड़ने के बिना सीडीएटीए ब्लॉक के अंदर नहीं हो सकता है।

सीएसवी संभवतः अधिकांश स्थितियों के लिए एक बेहतर विचार है।


बेस 64 एनकोड एक सरल उपाय है, हालांकि इसका मुख्य कारण सीएसवी का उपयोग किया जाता है क्योंकि आपको टेक्स्ट को वापस नहीं करना पड़ता है, बेस 64 का उपयोग करके आप अपने स्वयं के प्रारूप का पूरी तरह से आविष्कार कर सकते हैं।
रोल

1

वैसे यह आपके पाठ की प्रकृति पर कुछ हद तक निर्भर करता है, लेकिन एक ऊर्ध्वाधर बार 0x7C पाठ में बहुत बार फसल नहीं करता है।


1

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


1

दोनों पाइप और कैरेट स्पष्ट विकल्प हैं। मैं यह नोट करूंगा कि यदि उपयोगकर्ताओं से पूरी प्रतिक्रिया टाइप करने की अपेक्षा की जाती है, तो पाइप की तुलना में किसी भी कीबोर्ड को ढूंढना आसान है।

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