2009-11-27 12 views
15

का उपयोग कर सीएसवी पार्सिंग के साथ एक मूल समस्या पर काबू पाने के लिए मुझे FasterCSV (1.5.0) के साथ एक CSV पार्सिंग समस्या मिली है जो एक वास्तविक बग की तरह लगता है, लेकिन मुझे उम्मीद है कि इसके लिए एक कामकाज है।FasterCSV मणि

असल में, विभाजक के बाद एक जगह जोड़ना (मेरे मामले में अल्पविराम में) जब फ़ील्ड उद्धरणों में संलग्न होते हैं तो MalformedCSVError उत्पन्न करता है।

यहाँ एक सरल उदाहरण है:

# No quotes on fields -- works fine 
FasterCSV.parse_line("one,two,three") 
=> ["one", "two", "three"] 

# Quotes around fields with no spaces after separators -- works fine 
FasterCSV.parse_line("\"one\",\"two\",\"three\"") 
=> ["one", "two", "three"] 

# Quotes around fields but with a space after the first separator -- fails! 
FasterCSV.parse_line("\"one\", \"two\",\"three\"") 
=> FasterCSV::MalformedCSVError: Illegal quoting on line 1. 

Am मैं पागल हो रहा है, या इस FasterCSV में एक बग है?

उत्तर

14

MalformedCSVError यहां सही है।

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

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

+0

क्या अंतरिक्ष कह रहा है कि क्षेत्र वास्तव में उद्धरणों से घिरा हुआ नहीं है (क्योंकि पहला char उद्धरण नहीं है) और उद्धरण फ़ील्ड सामग्री के हिस्से के रूप में लिया जाना चाहिए? –

+1

ऐसा लगता है कि मैं गलत हूं। "यदि फ़ील्ड डबल कोट्स के साथ संलग्न नहीं हैं, तो फ़ील्ड के अंदर डबल कोट्स दिखाई नहीं दे सकते हैं।" - http://tools.ietf.org/html/rfc4180#section-2 –

+0

आप सही हैं, मुझे नहीं पता था कि सीएसवी के लिए 'spec' था लेकिन ऐसा लगता है कि वहां है। FasterCSV वास्तव में बहुत सख्त है। – Olly

2

शायद आप इसे सेट कर सकते हैं: col_sep: विकल्प ',' को इस तरह की फाइलें बनाने के लिए।

2

मुझे आशा थी कि :col_sep विकल्प नियमित अभिव्यक्ति की अनुमति दे सकता है, लेकिन ऐसा लगता है कि पढ़ने और लिखने दोनों के लिए यह एक शर्म की बात है। documentation ज्यादा आशा नहीं रखता है और अपनी जरूरत शायद की तुलना में एक परिवर्तन का अनुरोध या एक पैच ;-)

सबमिट करते समय आप #parse_line स्पष्ट रूप से कॉल कर रहे हैं से संतुष्ट किया जा सकता है और तत्काल है, तो आप हमेशा

कह सकते हैं
gsub(/,\s*/, ',') 

आपकी इनपुट लाइन पर। यदि आप उद्धृत तारों के भीतर अल्पविराम-स्थान की संभावना की अपेक्षा करते हैं तो उस नियमित अभिव्यक्ति को महत्वपूर्ण रूप से बदलने की आवश्यकता हो सकती है। (मैं एक उपयुक्त टैग के साथ इस तरह के एक प्रश्न को दोबारा पोस्ट करने का सुझाव दूंगा और इस मामले में RegEx mavens को ढीला होना चाहिए)।