如何使用Ruby以CSV格式排除以A,B或C开头的行

len*_*hok 1 ruby csv string boolean data-analysis

我写了以下代码:

dataexc = data.select do |element| 
  element[:cz_name] || element[:tor_other_cz_name]
    false if [0] == “A” || [0] == “B” || [0] == “C”
    end
  end
Run Code Online (Sandbox Code Playgroud)

这将返回NameError:undefined局部变量或main:Object的方法"A"

我试图排除所有以A,B或C开头的位置,这些位置存在于我的电子表格中的两列中.我已经将CSV文件放入"数据"中的数组中,现在我正在使用"dataexc"来尝试缩小条件以排除具有这些位置的行.任何人都可以帮我写这个有效吗?

我也试图弄清楚如何解决一个编码错误(?)导致我的一个CSV用irb中的错误数量的值打开.如果您认为您可以帮助我(任何和所有帮助都表示赞赏!),有更多关于我在这里做什么的信息.

更新:

如果其他人试图找到初学者可以理解的解决方案,-ABC代码的当前工作状态是:

cleaned_data = data.reject do |e|
  letters = ["A", "B", "C"]
  if e[:cz_name]
    letters.include?(e[:cz_name][0])
  end
end

cleaned_data = cleaned_data.reject do |e|
  letters = ["A", "B", "C"]
  if e[:tor_other_cz_name]
    letters.include?(e[:tor_other_cz_name][0])
  end
end
Run Code Online (Sandbox Code Playgroud)

如果你要居高临下,请不要在这里发帖.

也就是说,如果有其他人想要帮助这个项目,我会非常感激,我会在Github上为你提供的.

Ama*_*dan 5

我是这样写的:

data.reject { |row|
  row.values_at(:cz_name, :tor_other_cz_name).any? { |val|
    val =~ /^[ABC]/
  }
}
Run Code Online (Sandbox Code Playgroud)

"拒绝列中任何值:cz_name:tor_other_cz_name匹配模式的行'以A,B或C'开头."

至于你的代码,那里有很多错误.

  • def定义方法,而不是变量.如果您尝试定义方法,请不要使用=.

  • for 几乎没有在Ruby中使用过,你不能在这种语法中使用它

  • element[:cz_name] || element[:tor_other_cz_name]只要element[:cz_name]它存在,或者如果不存在则另一个存在.它不会检查两者.

  • [0]不是字符串的第一个字符,它是一个内部为零的数组.element[:cz_name][0]将是该字符串的第一个字符.

  • if condition; bool = true; else; bool = false; end 相当于 bool = condition

  • “A”是不一样的"A".不要在Word或任何其他文字处理器中编写代码,使用文本编辑器:智能引号是编程中的死亡.

  • 如果您的最后一个值是false if condition,如果为condition真,则返回值为nil.这两个nilfalse是falsey,所以你最终不能辨别什么.

我建议重新学习Ruby语法.在某个地方查找书籍或教程,并按顺序完成所有练习.你有太多的基本错误.

  • 绝对!书籍或参考书对于理解语法是绝对必要的.这个问题充满了混乱,很明显有必要解释这些规则.这不是CSI.您不能只输入随机代码并期望它能够正常工作. (2认同)