Wie konvertiere ich eine durch Kommas getrennte Zeichenfolge in ein Array?

75

Gibt es eine Möglichkeit, eine durch Kommas getrennte Zeichenfolge in Ruby in ein Array zu konvertieren? Wenn ich zum Beispiel eine Zeichenfolge wie diese hätte:

"one,two,three,four"

Wie würde ich es in ein Array wie dieses konvertieren?

["one", "two", "three", "four"]
Mark Szymanski
quelle
Warum gibt es das "csv" -Tag? Dies funktioniert nicht mit .csvDateien, sondern nur mit einer durch Kommas getrennten Zeichenfolge.
Mark Szymanski
1
CSV steht für Comma Separated Values. Das ist deine Saite. Es ist eine ziemlich übliche Methode zum Speichern von seriellen oder tabellarischen Daten im Zeichenfolgenformat. Es muss nicht unbedingt direkt aus einer Datei gelesen werden.
Lèse Majesté
@ Lèsemajesté: Ah, ok, ich dachte nur, dass CSV nur die Datei ist. Vielen Dank!
Mark Szymanski

Antworten:

144

Verwenden Sie dazu die folgende splitMethode:

"one,two,three,four".split(',')
# ["one","two","three","four"]

Wenn Sie führende / nachfolgende Leerzeichen ignorieren möchten, verwenden Sie:

"one , two , three , four".split(/\s*,\s*/)
# ["one", "two", "three", "four"]

Wenn Sie mehrere Zeilen (dh eine CSV-Datei) in separate Arrays analysieren möchten:

require "csv"
CSV.parse("one,two\nthree,four")
# [["one","two"],["three","four"]]
Kevin Sylvestre
quelle
Gibt es eine äquivalente Funktion zu PHPs str_getcsv, die automatisch CSVs in Anführungszeichen, Werte wie (Escape-) Kommas, mehrzeilige CSVs usw. verarbeiten?
Lèse Majesté
1
@ Lèse majesté: Ja, siehe meine Antwort.
Ephemient
Was ist mit "eins, zwei, drei, vier" - gibt es eine schnelle Möglichkeit, den Raum zu verkleinern?
Vanboom
5
@vanboom "one, two, three, four".split(/\s*,\s*/). Split funktioniert auch mit einem regulären Ausdruck. Alternativ können Sie die mapMethode verwenden, wenn Sie diese Syntax bevorzugen:"one, two, three, four".split(',').map(&:strip)
Kevin Sylvestre
16
require 'csv'
CSV.parse_line('one,two,three,four') #=> ["one", "two", "three", "four"]
kurzlebig
quelle
Dies wird nilfür leere Elemente zurückkehrenCSV.parse_line("one,two,,four") #=> ["one", "two", nil, "four"]
Mark Swardstrom
9
>> "one,two,three,four".split ","
=> ["one", "two", "three", "four"]
DigitalRoss
quelle