具有逗号分隔值和换行符的字符串:拆分值并为每个换行创建数组

时间:2014-12-31 14:06:05

标签: ruby ruby-2.0 ruby-2.1

我有一个这样的字符串(来自表单提交):

"apple, banana\r\ncherries\r\n\r\ngrapes, blue berries \r\n\r\n \r\norange"

如何检测值并为每行包含文本的行创建数组?像这样:

[
  ["apple", "banana"],
  ["cherries"],
  ["grapes", "blue berries"],
  ["orange"]
]

5 个答案:

答案 0 :(得分:4)

require "csv"

str = "apple, banana\r\ncherries\r\n\r\ngrapes, blue berries \r\n\r\n \r\norange"

rows = CSV.parse(str, skip_blanks: true)
rows = rows.map{|row| row.map(&:strip)} # remove leading and trailing whitespace
rows.delete([""]) 

p rows # => [["apple", "banana"], ["cherries"], ["grapes", "blue berries"], ["orange"]]

答案 1 :(得分:3)

s = "apple, banana\r\ncherries\r\n\r\ngrapes, blue berries \r\n\r\n \r\norange"
s.each_line.reject { |l| l =~ /^\s+$/ }.map { |l| l.strip.split(', ') }

肯定会有更短的内容

答案 2 :(得分:2)

更多相同:

s.each_line.map { |l| l.strip.split(', ') }.reject(&:empty?)

Ruby很有趣!

答案 3 :(得分:0)

你可以试试这个:

a = "apple, banana\r\ncherries\r\n\r\ngrapes, blue berries \r\n\r\n \r\norange"
a.gsub("\r", "").each_line.map{|d| d.strip.split(",")}.reject(&:empty?)

......你绝对可以重构这个。

答案 4 :(得分:0)

试试这个?

s = "apple, banana\r\ncherries\r\n\r\ngrapes, blue berries \r\n\r\n \r\norange"

result = s.split(/[\r\n]+/).map do |match|
  next unless match =~ /\w/
  match.strip.split(/,\s?/)
end

result.compact # => [["apple", "banana"], ["cherries"], ["grapes", "blue berries"], ["orange"]]

如果简洁更好:

s.split(/[\r\n]+/).map { |m| next unless m =~ /\w/; m.strip.split(/,\s?/) }.compact