2012-02-10 8 views
8

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

इस डेटा वर्ष/असमर्थित है। मैं इस पर कुछ जीवन पुश करने के लिए कोशिश कर रहा हूँ।

जैसे

"AAAAA 
AAAA 
AAAA 
AAAA","AAAAAAAA 


AAAAAA 
AAAAA "AAAAAA" AAAAAAAAA 
AAAAAAAAAAAAAAAAAAAAAAAAA, AAAAA 
AAAAAAAAA AAAAA AAAAAAAAAA 
AAAAA, "AAAAA", AAAAAAAAA 
AAAAAAAA AAAAAAAA 
AAAAAAA 
" 

इस फ़ाइल पार्सर ट्रिपिंग जाता है, और एक त्रुटि _csv.Error: newline inside string फेंकता है। मैं इसे नीचे इस किया जा रहा है इस मुद्दे को 2 क्षेत्र के अंदर से उद्धरण चिह्न निकाल कर narrrowed और csv.reader मॉड्यूल फ़ाइल ठीक से पार्स

इनमें से कुछ खेतों में बहु रेखा है - मुझे यकीन नहीं है कि यह जानना महत्वपूर्ण है या नहीं।

मैं बोली सेटिंग में चारों ओर घूम रहा हूं, और जब भी मैं 'skipinitialspace' पा सकता हूं, यह समस्या को हल नहीं करता है।

स्पष्ट है -। यह वैध 'CSV' नहीं, अपने डेटा वस्तुओं है कि शिथिल क्षेत्र परीक्षण के अंदर एक सीएसवी संरचना वर्ण पालन करें, लेकिन है, और "है

lineterminator \ x0d \ x0a

है

मैं एक नंबर की कोशिश की है doublequote के differnt permuations और बोली मॉड्यूल में के हवाले से चर पर चला जाता है की है, लेकिन मैं यह सही ढंग से पार्स नहीं मिल सकता है।

मुझे विश्वास नहीं किया जा सकता है कि एक, "या", संयोजन केवल क्षेत्र सीमाओं पर मौजूद है।

यह समस्या केवल फ़ाइल में कई फ़ील्ड के एक (अंतिम) के लिए मौजूद है, और कई हजार फ़ाइलें हैं।

+3

उचित सीएसवी लगातार दो उद्धरण वर्ण का उपयोग करता है ('" "') एक उद्धृत क्षेत्र में एक उद्धरण कैरेक्टर से बचने के लिए। वैकल्पिक रूप से, क्षेत्र को निर्विवाद किया जा सकता है और कोई भाग्य निरंतर नहीं है, हालांकि अल्पविराम और न्यूलाइन इस तरह के क्षेत्र में प्रकट नहीं हो सकते हैं। इस तरह के एकल उद्धरण सामान्य रूप से मान्य नहीं हैं। क्या अधिकांश सीएसवी पाठकों (पायथन सहित) की अपेक्षाओं के अनुरूप बेहतर रूप से आपके सीएसवी डेटा के स्रोत के विकल्पों को संशोधित करना संभव है। – SingleNegationElimination

+1

मुझे डेटा विरासत में मिला - और इसमें बहुत कुछ है ... तो मैं एक पार्सर बनाने के अलावा कुछ भी नहीं कर सकता जो इसे फिर से अलग कर सकता है। –

+0

फाइलें क्षतिग्रस्त नहीं हैं, इसकी खराब/खराब रूप से एक सीएसवी के रूप में संरचित है।"मुझे डेटा विरासत में मिला" सटीक 'बहाना' है - बस यही होता है। डेटा पुराना/त्याग दिया गया है, और मैं इसे पुनरुत्थान करना चाहता हूं। –

उत्तर

3

मैं काफी अभी तक टिप्पणी करने की अनुमति कर रहा हूँ नहीं है, इसलिए मैं एक जवाब के रूप पोस्ट करेंगे ...

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

+0

अफसोस की बात है कि फील्ड टेक्स्ट में कॉमा भी हैं, लेकिन मुझे लगता है कि मुझे पार्सिंग के लिए सीएसवी मॉड्यूल को स्क्रैप करना होगा - मुझे भरोसा नहीं है कि मुझे या तो "या", फ़ील्ड टेक्स्ट में संयोजन नहीं मिलेगा , किस तरह का पूरा सीएसवी विचार busts ... –

+0

अच्छा, यह एक विचार था। मेरे काम पर डेटाबेस के लिए एक निश्चित डेटा फ़ील्ड के भीतर, मैंने अल्पविरामों के उपयोग को प्रतिबंधित कर दिया। मैं इसके साथ दूर जाने में सक्षम था, हालांकि, केवल 50,000 पंक्ति फ़ाइल में केवल 100 रिकॉर्ड प्रभावित हुए थे। – Herbie

+0

यह एक अच्छा विचार है, लेकिन मेरे पास कई हज़ार फाइलें हैं, प्रत्येक बहुत ज्यादा अज्ञात है - प्रतीक्षा करें - मैं इसे इस तरह से कर सकता हूं - मुझे पता है कि कानूनी "चार्स फाइल में हैं - मैं उन्हें ढूंढ सकता हूं, उन्हें बदल सकता हूं युगल के साथ, और उम्मीद है कि इस तरह एक वैध सीएसवी बनाओ। –

11

क्या आपने csv.QUOTE_NONE को quoting कीवर्ड तर्क के माध्यम से पारित करने का प्रयास किया है? इस पर परीक्षण करने के लिए कुछ कोड या डेटा के बिना, मुझे यह जानने का कोई तरीका नहीं है कि यह वास्तव में आपके डेटा पर काम करता है, लेकिन ऐसा लगता है कि आपके द्वारा प्रदान किए गए टुकड़े के साथ काम करना प्रतीत होता है।

>>> import csv 
>>> r = csv.reader(open('foo.csv', 'rb'), quoting=csv.QUOTE_NONE) 
>>> for row in r: print row 
... 
['"A"', '"B"', '"ccc "ccccccc" cccccc"'] 
+0

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

+0

@ जे गट्टुसो, उस स्थिति में, आपको वास्तव में कुछ और उदाहरण डेटा पोस्ट करना चाहिए। फ़ाइल का उपयोग करने वाला क्या delimiter करता है? यदि इसमें डेटा के दौरान बिखरे हुए उद्धरण और अल्पविराम हैं, तो यह एक अलग डिलीमीटर का उपयोग करना चाहिए। अन्यथा यह सिर्फ एक अच्छी तरह से गठित सीएसवी फ़ाइल नहीं है। – senderle

+0

डिलीमीटर एक मानक कॉमा है, इसकी बस अच्छी तरह से गठित नहीं है। मुझे लगता है कि मैं इसे पूर्व-पार्स कर सकता हूं, सही परिस्थितियों की तलाश कर रहा हूं और वहां डॉट्स के साथ उद्धरणों को प्रतिस्थापित कर सकता हूं ... मैंने सोचा था कि डायलेक्ट मॉड्यूल क्या था। मैं और उदाहरण पोस्ट करूंगा, लेकिन यह तेज डेटा नहीं है। समस्या यह है कि इसकी खराब सीएसवी, यह नहीं कि यह 'विशेष' है। –

2

मैं एक कनवर्टर लिखूंगा जो प्रारंभिक सीएसवी को पार्स करेगा और एक वैध आउटपुट करेगा। आप संभवतः ", या" \ n को सीमित करने के लिए तंत्र के रूप में उपयोग कर सकते हैं।

+0

प्रलोभन करता है, लेकिन वैध फ़ील्ड मार्कर हमेशा \ n सीमाओं पर नहीं होते हैं, और ", एक मान्य सीएसवी मार्कर धारणा खतरनाक होगी। –

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