2012-11-29 18 views
8

Ich habe versucht, eine durch Leerzeichen getrennte Zeichenfolge mit doppelten Anführungszeichen in R für einige Zeit zu trennen, aber ohne Erfolg. Ein Beispiel für eine Zeichenfolge ist wie folgt:Aufteilen einer Zeichenfolge durch Leerzeichen, außer wenn in Anführungszeichen enthalten

Niederschläge Schneefall „Channel-Speicher“ „Rivulet storage“

Es ist wichtig für uns, weil diese Spaltenüberschriften, die die nachfolgenden Daten übereinstimmen müssen. Es gibt auch andere Vorschläge zu dieser Seite, wie um dies zu realisieren, aber sie scheinen nicht mit R. Ein Beispiel zur Arbeit:

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

Hier einige Code ich habe versucht worden:

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

was würde ich mag ist

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

aber was ich bekommen ist:

[1] "" " " " " " " 

Der Vektor hat die richtige Länge (was ermutigend ist), aber natürlich sind die Strings leer oder enthalten ein einzelnes Leerzeichen. Irgendwelche Vorschläge?

Vielen Dank im Voraus!

Antwort

15

scan wird dies für Sie tun

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

Dank mplourde. Genau das habe ich gebraucht. – downtowater

5

Wie mplourde sagte scan verwenden. das ist bei weitem die sauberste Lösung (wenn Sie die \" behalten wollen, das heißt ...)

Wenn Sie reguläre Ausdrücke verwenden, dies zu tun (oder so nicht gelöst, die leicht von scan) wollen, Sie suchen noch es ist der falsche Weg. Ihre Regex gibt zurück, was Sie wollen, also wenn Sie das in Ihrem strsplit verwenden, schneidet es alles aus, was Sie behalten möchten.

In diesen Szenarien sollten Sie die Funktion gregexp betrachten, die die Startpositionen Ihrer Übereinstimmungen zurückgibt und die Längen der Übereinstimmung als Attribut hinzufügt. Das Ergebnis davon kann an die Funktion regmatches(), wie diese übergeben werden:

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

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

Aber wenn Sie nur den Charakter Vektor als die Lösung von mplourde kehrt muss, denn das gehen. Und das ist wahrscheinlich das, wonach Sie suchen.

+3

Sie könnten 'regmatches' anstelle von' mapply' verwenden: 'regmatches (str, gregexpr (regex, str, perl = TRUE)) [[1]]' –

+0

Konnte es nicht finden, thx für den Zeiger. entsprechend bearbeitet –

+0

danke Joris (und mplourde) - du hast Recht, Scan ist was ich brauche, aber sehr nützlich für mich zu sehen, wie Regmatches() in diesem Zusammenhang anwenden – downtowater

1

Sie können strapply aus Paket gsubfn verwenden. In strapply können Sie einen übereinstimmenden String anstelle des Splitting-Strings definieren.

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

[1] "rainfall"   "snowfall"   "'Channel storage'" "'Rivulet storage'" 
Verwandte Themen