2011-01-18 9 views
5

है मेरे पास एक CSV फ़ाइल है (जिसे मैंने डिज़ाइन नहीं किया है और मैं अब नहीं बदल सकता और न ही मैं इसे कभी भी बदल सकता हूं) जिसमें निम्न प्रकार की रेखाएं हैं:डेटा को अल्पविराम में विभाजित कर सकते हैं जब डेटा में अल्पविराम

"Surname, Firstname", yes, no, somestring, whatever, etc

आप यहाँ देख सकते हैं, पहले , एक अल्पविराम है जिस पर मैं स्ट्रिंग विभाजित करना चाहते हैं नहीं है। ध्यान दें कि यह विशेष कॉमा उद्धरण चिह्नों के भीतर संलग्न है।

इस वजह से

, एक सरल string.split(',') स्पष्ट रूप से काम नहीं करेगा, के रूप में यह मुझे के बजाय 6.

ऊपर स्ट्रिंग के लिए लंबाई 7 की एक सरणी देना होगा वहाँ एक रास्ता यह चारों ओर पाने के लिए है? मैं इसके बजाय स्ट्रिंग को विभाजित करने के लिए रेगेक्स का उपयोग करने के बारे में सोच रहा था, लेकिन मैं ऐसे पैटर्न के बारे में सोचने के लिए रेगेक्स में पर्याप्त सक्षम नहीं हूं जो केवल उन अल्पविरामों पर विभाजित होगा जो उद्धरण चिह्नों के अंदर संलग्न नहीं हैं।

मैं प्रत्येक स्ट्रिंग चार को चार द्वारा पढ़कर इसे करने के लिए बदसूरत, हैकी तरीके सोच सकता हूं लेकिन यह एक अंतिम उपाय होना चाहिए क्योंकि मुझे यकीन है कि ऐसा करने का एक बेहतर तरीका है!

+0

यह एक्सेल से .csv जैसा दिखता है। हमेशा मजा। अधिक मजेदार तब होता है जब डेटा में उद्धरण और कॉमा शामिल होते हैं ... –

+0

यह वास्तव में एक्सेल से नहीं है, लेकिन हाँ, मज़ा! :) यह नेट पर किसी स्थान से है, मेरा प्रोग्राम फ़ाइल को पढ़ता है और इसे पार्स करने का प्रयास करता है। – AndrewC

+1

एक समय में एक चरित्र को पढ़ना जरूरी नहीं है एक बदसूरत हैक। मैं एक सी # सीएसवी पार्सर खोजने की सलाह दूंगा, क्योंकि मुझे यकीन है कि ऐसी चीजें पहले से मौजूद हैं। –

उत्तर

1

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

बाद में, स्प्लिट चरित्र-दर-चरित्र तुलना करता है तो जब आप मौजूदा कोड को कॉल करते हैं तो यह कम बदसूरत क्यों होता है जो वास्तव में आप जो चाहते हैं वह बिल्कुल नहीं करता है?

किसी भी दर पर, मेरा दृष्टिकोण अपना कोड लिखना था। और मैंने http://www.blackbeltcoder.com/Articles/files/reading-and-writing-csv-files-in-c पर ऑनलाइन कोड पोस्ट किया है।

+0

धन्यवाद जोनाथन। मैं आपके कोड का उपयोग करने के तरीके के बारे में थोड़ा उलझन में हूं, मुझे यकीन नहीं है कि मुझे ReadRow() में पैरामीटर पास करने की आवश्यकता क्यों है? – AndrewC

+0

पैरामीटर डेटा पढ़ने के साथ पॉप्युलेट हो जाता है। –

+0

पूरी तरह से काम किया! धन्यवाद जोनाथन। – AndrewC

5

आप TextFieldParser class का उपयोग करके इसे आसानी से संभाल सकते हैं। बस HasFieldsEnclosedInQuotes को सत्य पर सेट करें।

+0

जब आप सी # प्रश्न के रूप में पोस्ट किए गए थे तो आप .NET 4.5 दृश्य मूल कक्षा का संदर्भ दे रहे हैं। – aggaton

+2

@aggaton बस क्योंकि माइक्रोसॉफ्ट में टाइप है। विज़ुअल बेसिक नेमस्पेस का मतलब यह नहीं है कि इसका उपयोग सी # से नहीं किया जा सकता है। 'TextFileParser' सी # से बहुत अच्छा काम करता है, और यह मुख्य रूपरेखा का हिस्सा है - इससे बचने का कोई कारण नहीं है। –

+0

@ReedCopsey यह 'TextFieldParser' है, हालांकि, 'TextFileParser' नहीं। आप सही चीज़ से लिंक करने में कामयाब रहे लेकिन लगातार इसे गलत लिखते हैं। – Nyerguds

2

मैं एक सीएसवी पार्सर लाइब्रेरी का उपयोग करने का सुझाव दूंगा - ऐसे कई अन्य मामले हैं जिनके बारे में आपने सोचा नहीं था (उद्धृत क्षेत्र के हिस्से के रूप में नई पंक्ति)।

VisualBasic नामस्थान में एक अच्छी लाइब्रेरी है जो मदद कर सकती है - TextFieldParser

+1

सी # devs VisualBasic नामस्थान के बारे में चिंता नहीं करना चाहिए। आईआरएल के अलावा कुछ भी नहीं, मशीन पर नहीं निर्भरता, – Will

+0

सुंदर, और जैसा कि @Will ने कहा, सी # में उपयोग किए जाने पर ठीक काम करता है। माइक्रोसॉफ्ट इस तरह के विषम स्थानों में इस तरह के औजारों को क्यों छिपाता है? – Nyerguds

संबंधित मुद्दे