सिद्धांत में अच्छा है, व्यवहार में भयानक है
CSV द्वारा मैं आपको RFC 4180 में वर्णित कन्वेंशन का मतलब मानने जा रहा हूँ ।
बुनियादी सीएसवी डेटा का मिलान करना तुच्छ है:
"data", "more data"
नोट: BTW, यह एक .split ('/ n') का उपयोग करने के लिए बहुत अधिक कुशल है। इस तरह से बहुत सरल और अच्छी तरह से संरचित डेटा के लिए विभाजन ('' '') फंक्शन। नियमित एक्सप्रेशन NDFSM (गैर-नियतात्मक परिमित) के रूप में कार्य करता है। स्टेट मशीन) जो एक बार बर्बाद होने से बच जाती है, एक बार जब आप एग्जिट केस जोड़ना शुरू कर देते हैं जैसे कि बच के चर्चे।
उदाहरण के लिए यहाँ सबसे व्यापक नियमित अभिव्यक्ति मिलान स्ट्रिंग मैंने पाया है:
re_valid = r"""
# Validate a CSV string having single, double or un-quoted values.
^ # Anchor to start of string.
\s* # Allow whitespace before value.
(?: # Group for value alternatives.
'[^'\\]*(?:\\[\S\s][^'\\]*)*' # Either Single quoted string,
| "[^"\\]*(?:\\[\S\s][^"\\]*)*" # or Double quoted string,
| [^,'"\s\\]*(?:\s+[^,'"\s\\]+)* # or Non-comma, non-quote stuff.
) # End group of value alternatives.
\s* # Allow whitespace after value.
(?: # Zero or more additional values
, # Values separated by a comma.
\s* # Allow whitespace before value.
(?: # Group for value alternatives.
'[^'\\]*(?:\\[\S\s][^'\\]*)*' # Either Single quoted string,
| "[^"\\]*(?:\\[\S\s][^"\\]*)*" # or Double quoted string,
| [^,'"\s\\]*(?:\s+[^,'"\s\\]+)* # or Non-comma, non-quote stuff.
) # End group of value alternatives.
\s* # Allow whitespace after value.
)* # Zero or more additional values
$ # Anchor to end of string.
"""
यह यथोचित रूप से एकल और दोहरे उद्धरण चिह्नों को संभालता है, लेकिन मूल्यों में नयापन नहीं है, उद्धरणों से बच गया है, आदि।
स्रोत: स्टैक ओवरफ्लो - मैं जावास्क्रिप्ट के साथ एक स्ट्रिंग पार्स कैसे कर सकता हूं
एक बार यह एक दुःस्वप्न बन जाता है, जब आम किनारे के मामलों को पेश किया जाता है ...
"such as ""escaped""","data"
"values that contain /n newline chars",""
"escaped, commas, like",",these"
"un-delimited data like", this
"","empty values"
"empty trailing values", // <- this is completely valid
// <- trailing newline, may or may not be included
अकेले न्यूलाइन-ए-वैल्यू एज केस वाइल्ड में पाए जाने वाले रेजेक्स आधारित पर्सर्स के 99.9999% को तोड़ने के लिए पर्याप्त है। एकमात्र 'वाजिब' विकल्प है RegEx का उपयोग बेसिक कंट्रोल / नॉन-कंट्रोल कैरेक्टर (यानी टर्मिनल बनाम नॉन-टर्मिनल) टोकन के लिए जो एक स्टेट मशीन के साथ उच्च स्तर के विश्लेषण के लिए उपयोग किया जाता है।
स्रोत: अनुभव अन्यथा व्यापक दर्द और पीड़ा के रूप में जाना जाता है।
मैं jquery-CSV का लेखक हूं , जो एकमात्र जावास्क्रिप्ट है, जो पूरी तरह से RFC- कम्प्लायंट, CSV पार्सर है। मैंने इस समस्या से निपटने में कई महीने बिताए हैं, कई बुद्धिमान लोगों के साथ बात कर रहे हैं, और एक टन की कोशिश कर रहे हैं, तो कोर पार्सर इंजन के 3 पूर्ण पुनर्लेखन सहित विभिन्न कार्यान्वयन।
tl; dr - कहानी का नैतिक, PCRE अकेले कुछ भी पार्स करने के लिए चूसता है लेकिन सबसे सरल और सख्त नियमित (Ie टाइप- III) व्याकरण। यद्यपि, यह टर्मिनल और गैर-टर्मिनल स्ट्रिंग को टोकन देने के लिए उपयोगी है।