簡體   English   中英

具有逗號分隔值和換行符的字符串:拆分值並為每個換行符創建數組

[英]String with comma-separated values and newlines: split values and create arrays for each newline

我有一個這樣的字符串(來自表單提交):

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

如何檢測值並為每行包含文本的行創建一個數組? 像這樣:

[
  ["apple", "banana"],
  ["cherries"],
  ["grapes", "blue berries"],
  ["orange"]
]
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"]]
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(', ') }

肯定有些短

更多相同:

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

Ruby是有趣的東西!

您可以嘗試以下方法:

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?)

...而且您絕對可以重構它。

嘗試這個?

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM