【问题标题】:How to exclude rows starting with A, B, or C in CSV with Ruby如何使用 Ruby 在 CSV 中排除以 A、B 或 C 开头的行
【发布时间】:2016-08-26 01:42:30
【问题描述】:

我写了以下代码:

dataexc = data.select do |element| 
  element[:cz_name] || element[:tor_other_cz_name]
    false if [0] == “A” || [0] == “B” || [0] == “C”
    end
  end

这会返回 NameError: undefined local variable or method `“A”' for main:Object

我正在尝试排除存在于我的电子表格的两列中的任何一列中以 A、B 或 C 开头的所有位置。我已经将 CSV 文件放入“data”中的数组中,现在我正在使用“dataexc”来尝试缩小标准以排除具有这些位置的行。有人可以帮我写这个吗?

我还试图弄清楚如何解决导致我的一个 CSV 在 irb 中打开错误数量的值的编码错误 (?)。如果您认为您可以帮助我(感谢任何和所有帮助!),还有更多关于我在做什么的信息here

更新:

如果其他人试图找到初学者可以真正理解的解决方案,-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

如果您要居高临下,请不要在这里发帖。

也就是说,如果其他人想帮助这个项目,我将非常感激,我会在 Github 上感谢你。

【问题讨论】:

  • 请格式化您的代码以提高可读性。
  • “还有一个问题”:不是 Stack Overflow 的工作原理。每个问题应该是一个单元。如果你想澄清这个问题,那很好;但一个不相关的问题应该是一个不相关的问题。此外,“回归基础”并不是我居高临下,而是提供了我所拥有的最佳建议。
  • 好的,删除了另一个问题。谢谢你。我认为 tadman 对 CSI 的评论是居高临下的,这就是我所指的。你的评论确实假设我有一些东西可以“回去”,但在这种情况下这是不正确的;我刚开始学习。我看到其他初学者因为更有经验的程序员的恶作剧而非常气馁,这很糟糕。无论如何,感谢您提供的信息丰富的回答。我想了解您的代码,但最后一行让我感到困惑。其他人告诉我它使用正则表达式,我不应该深入研究。
  • 我答案的最后一行确实包含正则表达式。您可以将val =~ /^[ABC]/ 替换为%w(A B C).include?(val[0])。 (%w(A B C) 只是编写 ["A", "B", "C"] 的一种更简洁的方式。)但就目前而言,它是一个非常了解 Ruby 的人可能编写它的示例。

标签: ruby string csv boolean data-analysis


【解决方案1】:

我会这样写:

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

"拒绝: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 为真,则返回值为nilnilfalse 都是假的,所以你最终不会歧视任何东西。

我建议重新学习 Ruby 语法。在某处找一本书或一个教程,按顺序做所有的练习。你的基本错误太多了。

【讨论】:

  • 绝对!书或参考书对于理解语法是绝对必要的。这个问题充满了困惑,很明显有必要解释一下规则。这不是CSI。您不能只输入随机代码并期望它起作用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-01-08
  • 2019-01-15
相关资源
最近更新 更多