【问题标题】:Ruby CSV::Row fetch(){block}, block not firingRuby CSV::Row fetch(){block},块不触发
【发布时间】:2017-07-05 23:36:18
【问题描述】:
$ 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。现在,我正在使用这两行代码,但它们对我来说不够优雅。更令人担忧的是,他们似乎指出我根本不明白如何在 ruby​​ 中正确使用块。

同样,这些工作足够好:

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(){}.

非常感谢!

【问题讨论】:

    标签: ruby csv import


    【解决方案1】:

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

    from CSV::Row.fetch:

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

    如果你想让你的代码有说服力健壮,请尝试使用默认参数,当找不到标头时返回该参数:

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

    如果你不希望找不到标题,你可以侥幸逃脱:

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

    【讨论】:

    • 感谢这个 eiko——我显然误解了如何使用 fetch 块。我文件中的所有行都有“yes/NO/Nil 系列”的内容,因此永远不会使用默认值。此外,虽然我没有使用过tap,但我认为在这种情况下,该块将返回真或假,但未修改的字符串对象将由.tap{}返回
    • 啊,好吧,如果您不想防止丢失行,那么您可以进一步简化:column = row.fetch("Header42") && temp.downcase == "yes" 虽然我更愿意期待意外 ^-^ 而且您对点击绝对正确,我的错!我猜你不能总是满足使用水龙头的单线渴望。我会从我的答案中删除它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-24
    • 1970-01-01
    • 1970-01-01
    • 2021-01-10
    • 2020-08-10
    • 2014-08-03
    • 1970-01-01
    相关资源
    最近更新 更多