क्या फॉर्मेटिंग को तोड़े बिना CSV कॉलम में कॉमा को शामिल करने का कोई तरीका है?


282

मुझे एक नाम और एक नंबर के साथ एक दो कॉलम CSV मिला है। कुछ लोगों के नाम कॉमा का उपयोग करते हैं, उदाहरण के लिए Joe Blow, CFA.यह कॉमा सीएसवी प्रारूप को तोड़ता है, क्योंकि इसकी व्याख्या एक नए कॉलम के रूप में की जाती है।

मैंने पढ़ा है और सबसे आम नुस्खे से लगता है कि वह चरित्र बदल रहा है, या परिसीमन की जगह एक नया मान ले रहा है (उदाहरण के लिए this|that|the, other)।

मैं वास्तव में अल्पविराम विभाजक रखना चाहता हूं (मुझे पता है कि एक्सेल अन्य सीमांकक का समर्थन करता है लेकिन अन्य दुभाषिए नहीं कर सकते हैं)। मैं भी नाम में अल्पविराम रखना चाहूंगा, जैसा Joe Blow| CFAकि बहुत मूर्खतापूर्ण लगता है।

क्या CSV स्तंभों में स्वरूपण को तोड़ने के बिना कॉमा को शामिल करने का एक तरीका है, उदाहरण के लिए उन्हें छोड़कर?



मेरे लिए काम करने वाली छोटी हैक: पाठ संपादक में सीएसवी फ़ाइल खोलें, फिर एक एक्सेल दस्तावेज़ में पेस्ट करें। काम करता है अगर आप इसे बड़ी मात्रा में कर सकते हैं।
जोनास

@ जोनास: एक्सेल यह अनुमान नहीं लगा सकता है, कि एक ही टोकन को सीमांकक या डेटा के भाग के रूप में उपयोग किया जाता है या नहीं। एक पाठ संपादक से चिपकाने से वह नहीं बदलता है।
IInspectable

जवाबों:


370

उद्धरण, जैसे क्षेत्र में संलग्न करें

field1_value,field2_value,"field 3,value",field4, etc...

देखें विकिपीडिया

अपडेट किया गया :

एक उद्धरण, उपयोग करने के लिए ", एक क्षेत्र में एक डबल उद्धरण चिह्न के रूप में एन्कोड किया जाएगा "", और संपूर्ण फ़ील्ड बन जाएगा """"। इसलिए यदि आप उदाहरण के लिए एक्सेल देखते हैं:

---------------------------------------
| regular_value |,,,"|  ,"", |"""   |"|
---------------------------------------

CSV फ़ाइल में होगा:

regular_value,",,,""",","""",","""""""",""""

एक अल्पविराम बस उद्धरणों का उपयोग कर समझाया ,जाता है , इसलिए बन जाता है ","

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


4
यह मेरे लिए काम किया! मैं CSV को js वैरिएबल निर्यात कर रहा था, और हर स्ट्रिंग के चारों ओर एक अतिरिक्त जोड़ी लगाकर, "जॉन ब्लो, CFA" की समस्या को हल करने में मदद की, जैसा कि प्रश्न में उल्लेख किया गया है।
मधुलिका मुखर्जी

यदि प्रत्येक कोशिका के अंदर उद्धरण और अल्पविराम दोनों हों तो क्या होगा?
स्पीडप्लेन

2
मैंने कुछ उदाहरणों के साथ उत्तर को अपडेट किया - संक्षेप में, अल्पविराम को उद्धरण (जैसे ",") में समझाया गया है , और उद्धरण से बच गए हैं (उदाहरण के लिए """)
रयान

6
अब यह स्वीकार किया जाना चाहिए जवाब के रूप में यह एक महान समाधान का प्रस्ताव है कि संभावना का उपयोग मामलों के 99% हल करती है।
बुज़ ज़ूल

क्या कोई सी # लाइब्रेरी है जो क्वैस-एस्केप्ड फ़ील्ड्स के साथ सीएसवी फ़ाइलों को पार्स करने के लिए है?
मिन्ह

34

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

संदर्भ युक्ति


10
RFC 4180, कॉमा-सेपरेटेड वैल्यूज़ (CSV) फ़ाइलों के लिए सामान्य प्रारूप और MIME प्रकार, ietf.org/rfc/rfc4180.txt ; एक और 'आधिकारिक' विनिर्देश।
Shi

3
सबसे व्यापक रूप से स्वीकृत दृष्टिकोण को शामिल करने से यह एक शानदार उत्तर बन जाएगा। जैसा कि यह खड़ा है, @Ryan द्वारा उत्तर जीतता है।
रिनोगो

16

यदि आप यह कहना चाहते हैं कि आप उद्धरणों का उपयोग कर सकते हैं। कुछ इस तरह

$name = "Joe Blow, CFA.";
$arr[] = "\"".$name."\"";

तो अब, आप अपने नाम चर में अल्पविराम का उपयोग कर सकते हैं।


अपने टिप के लिए धन्यवाद बादल, कि यह किया: $whatever = "\"".$name."\"";
washere

आपके समाधान के लिए धन्यवाद।
भाविन थुम्मर

10

आपको उस मूल्यों को उद्धृत करने की आवश्यकता है।
यहाँ एक अधिक विस्तृत कल्पना है।


2
कई ऐनक हैं, एक्सेल प्रविष्टि के आसपास के उद्धरणों का उपयोग करता है, लिनक्स बैकस्लैश चरित्र का उपयोग करता है। दुर्भाग्य से, आपको अपने इच्छित दर्शकों / लक्ष्य प्रणाली के लिए भागने की आवश्यकता है।
Rudu

7

अन्य उत्तरों में बिंदुओं के अलावा: एक बात ध्यान रखें यदि आप एक्सेल में उद्धरण का उपयोग कर रहे हैं तो आपके रिक्त स्थान का स्थान है। यदि आपके पास इस तरह का कोड है:

print '%s, "%s", "%s", "%s"' % (value_1, value_2, value_3, value_4)

Excel प्रारंभिक उद्धरण को अल्पविराम से बचने के लिए उपयोग करने के बजाय एक शाब्दिक उद्धरण के रूप में व्यवहार करेगा। आपके कोड को बदलने की आवश्यकता होगी

print '%s,"%s","%s","%s"' % (value_1, value_2, value_3, value_4)

यही वह सूक्ष्मता थी जो मुझे यहां खींच लाई।


3

मैंने उसी समस्या का सामना किया और उद्धृत करने से ,मदद नहीं मिली। आखिरकार, मैंने उसके ,साथ बदल दिया +, प्रसंस्करण समाप्त कर दिया, आउटपुट को एक संगठन में सहेज लिया और उसके +साथ बदल दिया ,। यह बदसूरत लग सकता है लेकिन यह मेरे लिए काम करता है।


2
और अगर डेटा में "+" अक्षर होते हैं तो आपने क्या किया होगा?
एंड्रयू मॉर्टन

1
@AndrewMorton हां, यह एक चुनौती है। लेकिन मेरे मामले में, मुझे यकीन है कि +मेरे डेटा में बिल्कुल भी मौजूद नहीं है। आपकी टिप्पणी के लिए धन्यवाद।
मोहम्मद

4
सरल और मजबूत तरीका है कि डबल-कोट्स में स्ट्रिंग्स को घेरना और उनमें से दो का उपयोग करके स्ट्रिंग्स के भीतर डबल-कोट्स से बच जाना ""। यह इसे करने का सामान्य तरीका है।
एंड्रयू मोर्टन

1
यदि यह काम नहीं कर रहा है, तो जांच लें कि आप अपने परिसीमन वाले अल्पविराम के साथ रिक्त स्थान उत्पन्न नहीं कर रहे हैं: "मेंढक", "पीला, हरा" "मेंढक", "पीला, हरा" काम करेगा
Dazbert

व्यक्तिगत रूप से मुझे @AndrewMorton की दूसरी टिप्पणी यहाँ मिली जिसने वास्तव में मुझे यह समझने में मदद की कि स्वीकृत उत्तर से बेहतर क्या है। चरण 1 - डेटा फ़ील्ड्स में दोहरे उद्धरण चिह्नों से बचें, जैसे पायथन: field = field.replace('"', '""')चरण 2 - चरण 1 के बाद, स्वयं को दोहरे उद्धरणों में फ़ील्ड संलग्न करें जैसे field = '"' + field + '"'- फिर आप लोहे के पात्र हैं, मुझे लगता है।
Croxford

3

आपकी भाषा के आधार पर, एक to_json विधि उपलब्ध हो सकती है। यह कई चीजों से बच जाएगा जो CSV को तोड़ते हैं।


3

मैंने पाया कि मैक में नंबर जैसे कुछ एप्लिकेशन दोहरे उद्धरण को अनदेखा करते हैं यदि इसके पहले स्थान है।

a, "b,c"काम करते समय a,"b,c"काम नहीं करता है।


1
आपने शायद मुझे सिर्फ एक घंटे का काम दिया ... धन्यवाद!
Shaun314

1

आप अपने मानों को एनकोड कर सकते हैं, उदाहरण के लिए PHP base64_encode ($ str) / base64_decode ($ str)

IMO यह उद्धरणों को दोगुना करने आदि से सरल है।

https://www.php.net/manual/en/function.base64-encode.php

एन्कोड किए गए मानों में कभी भी अल्पविराम नहीं होगा इसलिए आपके CSV में प्रत्येक अल्पविराम एक विभाजक होगा।



0

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


0

सबसे पहले, यदि आइटम मूल्य में दोहरे उद्धरण वर्ण (") है, तो 2 दोहरे उद्धरण वर्ण (" ") से बदलें

item = item.ToString().Replace("""", """""")

अंत में, लपेटें आइटम मूल्य:

ON LEFT: दोहरे उद्धरण वर्ण के साथ (")

ऑन राइट: डबल कोट चरित्र (") और अल्पविराम चरित्र (,) के साथ

csv += """" & item.ToString() & ""","

0

डबल कोट्स ने मेरे लिए काम नहीं किया, इसने मेरे लिए काम किया \"। यदि आप उदाहरण के रूप में एक डबल कोट्स रखना चाहते हैं तो आप सेट कर सकते हैं\"\"

आप सूत्र बना सकते हैं, उदाहरण के लिए:

fprintf(strout, "\"=if(C3=1,\"\"\"\",B3)\"\n");

सीएसवी में लिखेंगे:

= IF (सी 3 = 1, "", बी 3)


0

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

सितम्बर = |

कहाँ | वह विभाजक है जिसका आप उपयोग करने के लिए Excel चाहते हैं। वैकल्पिक रूप से आप विंडोज में डिफ़ॉल्ट विभाजक को बदल सकते हैं, लेकिन थोड़ा-सा घुमावदार:

नियंत्रण कक्ष> घड़ी और क्षेत्र> क्षेत्र> प्रारूप> अतिरिक्त> संख्या> सूची विभाजक [अल्पविराम से अपने पसंदीदा विकल्प में परिवर्तन]। इसका मतलब है कि एक्सेल चुने गए विभाजक का उपयोग करके CSV को निर्यात करने में भी डिफ़ॉल्ट होगा।

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