2015-10-27 12 views
5

data una stringa di un array in Ruby con alcuni elementi tra virgolette che contengono le virgole:stringa di Spalato in un array da una virgola, a meno che non virgola è all'interno cita

my_string.inspect 
# => "\"hey, you\", 21" 

Come posso ottenere un array di:

["hey, you", " 21"] 
+7

Probabilmente meglio usare una gemma CSV esistente. "Come" è scrivere un parser CSV, che è più fastidioso di quanto si possa sospettare. –

+1

@DaveNewton grazie! Ho guardato nella libreria CSV di Ruby e "string" .parse_csv mi dà quello che sto cercando. – steel

risposta

5

La libreria CSV standard Ruby .parse_csv, fa esattamente questo.

require 'csv' 
"\"hey, you\", 21".parse_csv 
# => ["hey, you", " 21"] 
+0

Da quello che posso vedere, [String # parse_csv] (http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/String.html) è stato deprezzato (dal v1.9.2), in nel qual caso dovresti usare [CSV :: parse_line] (http://ruby-doc.org/stdlib-2.0.0/libdoc/csv/rdoc/CSV.html#method-c-parse_line) (cioè, 'require ' csv '; CSV.parse_line ("\" hey, you \ ", 21)'). Sai se questo è il caso ?. –

+0

@CarySwoveland sembra che la stringa #parse_csv sia ancora viva e vegeta a partire da Ruby 2.2. 3. http://www.rubydoc.info/stdlib/csv/String%3Aparse_csv e http://ruby-doc.org/stdlib-2.2.3/libdoc/csv/rdoc/CSV.html – steel

1

Sì, utilizzando CSV::parse_line è il modo di andare qui, ma si potrebbe anche farlo con una regex:

r =/
    (?:  # Begin non-capture group 
    (?<=\") # Match a double-quote in a positive lookbehined 
    .+?  # Match one or more characters lazily 
    (?=\") # Match a double quote in a positive lookahead. 
    )  # End non-capture group 
    |  # Or 
    \s\d+ # Match a whitespace character followed by one or more digits 
    /x  # Extended mode 

str = "\"hey, you\", 21" 
str.scan(r) 
    #=> ["hey, you", " 21"] 

Se invece si preferisce avere "21" piuttosto che " 21", è sufficiente rimuovere \s .

Problemi correlati