2012-11-29 9 views
8

私はしばらくの間、スペース区切りの文字列を二重引用符で分割しようとしましたが、成功しませんでした。次のように文字列の例は次のとおりです。引用符で囲まれている場合を除いて、スペースで文字列を分割する

降雨降雪「チャネル・ストレージ」「細流ストレージ」

これらは、後続のデータと一致している必要があり、列見出しているので、それが私たちのために重要です。そこにこのサイト上の他の提案は、このについて移動する方法としてあるが、それらはR.一つの例では動作していないようです:

:ここ

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 mplourdeが言ったように、scanを使用します

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

ありがとうmplourde。それがまさに私が必要としていたものです。 – downtowater

5

のためにこれを行います。あなたがこれを行うために正規表現を使用したい場合(または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

ありがとうJoris(とmplourde) - あなたが正しいです、スキャン私が必要ですが、非常に私はこの文脈でregmatches()を適用する方法を見て便利です – downtowater

1

パッケージgsubfnからstrapplyを使用できます。 strapplyでは、文字列を分割するのではなく、一致する文字列を定義することができます。

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

[1] "rainfall"   "snowfall"   "'Channel storage'" "'Rivulet storage'" 
関連する問題