Ruby CSV :: Row fetch(){block},阻止不触发

时间:2017-02-16 17:38:33

标签: ruby csv import

$ ruby -v; rails -v; grep DESCR /etc/lsb-release; psql --version 
ruby 2.3.3p222 (2016-11-21 revision 56859) [x86_64-linux]
Rails 4.2.0
DISTRIB_DESCRIPTION="Ubuntu 16.04.1 LTS"
psql (PostgreSQL) 9.5.5

我正在使用CSV.foreach(path, {headers: :first_row}) do |row|迭代.csv文件。我的数据中的一列是Yes / No-ish,我在创建记录之前将其转换为true / false。现在,我使用这两行代码,但它们对我来说不够优雅。更令人担忧的是,他们似乎指出我从根本上不了解如何在红宝石中正确使用积木。

同样,这些工作还不错:

temp = row.fetch("Header42") # { |something| could be processed here... }
column = (temp.nil? || !(temp.downcase.eql? "yes")) ? false : true

......但我看起来要少一些。我尝试了这个并最终得到了未翻译的字符串而不是所需的布尔值:

column = row.fetch("Header42") { |r| (r.nil? || !(r.downcase.eql? "yes")) ? false : true }

在街区玩puts时,我似乎无法解决这个问题 - 更不用说给我预期的任务价值了。

I'm using this as my documentation for CSV::Row.fetch(){}

非常感谢!

1 个答案:

答案 0 :(得分:0)

Row.fetch(header)抓取给定标头字符串的字段。如果该字段不存在,则然后调用该块,并为该块提供标题字符串。文档实际上是这样说的,尽管它确实有点令人困惑。在我理解之前,我必须阅读源代码。

from CSV::Row.fetch:

  

如果存在具有给定标头的字段,则返回其值。否则,如果给出了一个块,则会产生标题并返回其结果。

如果您想使代码雄辩健壮,请尝试使用default参数,该参数在找不到标题时返回:

column = (row.fetch("Header42", false)) && (temp.downcase == "yes")

如果您不希望找不到标题,您可以放弃:

column = row.fetch("Header42") && temp.downcase == "yes"