【问题标题】:String with comma-separated values and newlines: split values and create arrays for each newline具有逗号分隔值和换行符的字符串:拆分值并为每个换行符创建数组
【发布时间】:2015-02-27 14:36:21
【问题描述】:

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

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

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

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

【问题讨论】:

    标签: ruby ruby-2.0 ruby-2.1


    【解决方案1】:
    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"]]
    

    【讨论】:

      【解决方案2】:
      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(', ') }
      

      肯定有更短的

      【讨论】:

      • 数据应被视为 CSV 数据。在这种情况下,任意拆分逗号是可行的,但如果有嵌入的逗号,则会失败。
      【解决方案3】:

      更多相同:

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

      Ruby 很有趣!

      【讨论】:

        【解决方案4】:

        试试这个?

        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
        

        【讨论】:

          【解决方案5】:

          你可以试试这个:

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

          ...你绝对可以重构它。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 2016-10-19
            • 1970-01-01
            • 2021-01-11
            • 2018-07-19
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多