2012-11-29 18 views
8

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

वर्षा बर्फबारी "चैनल संग्रहण" "छोटी नदी भंडारण"

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

:

Regex for splitting a string using space when not surrounded by single or double quotes

यहाँ कुछ कोड मैं कोशिश कर रहा है

str <- 'rainfall snowfall "Channel storage" "Rivulet storage"' 
regex <- "[^\\s\"']+|\"([^\"]*)\"" 
split <- strsplit(str, regex, perl=T) 

कि मैं क्या चाहते हैं

[1] "rainfall" "snowfall" "Channel storage" "Rivulet storage" 

है, लेकिन मैं क्या मिलता है:

[1] "" " " " " " " 

वेक्टर सही लंबाई है (जो उत्साहजनक है) लेकिन निश्चित रूप से तार खाली हैं या एक ही स्थान है। कोई सुझाव?

अग्रिम धन्यवाद!

उत्तर

15

scan आप

scan(text=str, what='character', quiet=TRUE) 
[1] "rainfall"  "snowfall"  "Channel storage" "Rivulet storage" 
+0

धन्यवाद mplourde। यही वही है जो मुझे चाहिए था। – downtowater

5

रूप mplourde कहा, scan का उपयोग लिए यह कर देगा। कि अब तक साफ समाधान द्वारा

आप regexes उपयोग करने के लिए इस (या कुछ है कि आसानी से scan हल नहीं) करना चाहते हैं तो (जब तक आप, वह यह है कि \" रखने के लिए ... चाहते हैं), तो भी आप को देख रहे हैं यह गलत तरीका है। आपका रेगेक्स जो आप चाहते हैं वह लौटाता है, इसलिए यदि आप इसे अपने strsplit में उपयोग करते हैं तो यह आपके द्वारा रखे जाने वाले सभी चीजों को काट देगा।

इन परिदृश्यों में आपको gregexp पर फ़ंक्शन देखना चाहिए, जो आपके मैचों की शुरुआती स्थिति लौटाता है और मैच की लंबाई को एक विशेषता के रूप में जोड़ता है। इसी का परिणाम समारोह regmatches() के लिए पारित किया जा सकता है, इस तरह:

str <- 'rainfall snowfall "Channel storage" "Rivulet storage"' 
regex <- "[^\\s\"]+|\"([^\"]+)\"" 

regmatches(str,gregexpr(regex,str,perl=TRUE)) 

लेकिन अगर आप mplourde रिटर्न के समाधान के रूप में चरित्र वेक्टर की जरूरत है, उस के लिए जाना। और सबसे अधिक संभावना है कि वैसे भी आप वैसे भी हैं।

+3

आप 'mapply' के बजाय 'regmatches' का उपयोग कर सकते हैं:' regmatches (str, gregexpr (regex, str, perl = TRUE)) [[1]]' –

+0

पॉइंटर के लिए thx नहीं मिला। तदनुसार संपादित –

+0

धन्यवाद जोरीस (और mplourde) - आप सही हैं, मुझे स्कैन की जरूरत है, लेकिन इस संदर्भ में regmatches() को लागू करने के लिए मेरे लिए बहुत उपयोगी है – downtowater

1

आप पैकेज gsubfn से स्ट्रैपली का उपयोग कर सकते हैं। स्ट्रैपली में आप स्ट्रिंग स्ट्रिंग के बजाय मिलान स्ट्रिंग को परिभाषित कर सकते हैं।

str <- "rainfall snowfall 'Channel storage' 'Rivulet storage'" 
strapply(str,"\\w+|'\\w+ \\w+'",c)[[1]] 

[1] "rainfall"   "snowfall"   "'Channel storage'" "'Rivulet storage'" 
संबंधित मुद्दे