【问题标题】:Ignore rows with blank values while importing a CSV in rails application在 Rails 应用程序中导入 CSV 时忽略具有空白值的行
【发布时间】:2014-01-06 03:35:26
【问题描述】:

我有一个允许用户导入 CSV 数据的应用。

在用户开始在 CSV 文件中导入带有空白行的数据之前,一切正常。我正在使用以下内容从 CSV 文件中获取行:

CSV.readlines(import_file, headers: true, skip_blanks: true)

我认为如果我将选项添加到 skip_blanks,它会这样做,但它没有。关于如何忽略空白行的任何想法。

谢谢!

【问题讨论】:

  • 您确定用户提供的是空行吗,CSV 文件有时会很有趣
  • 请试试这个表格:CSV.new( ( open import_file ), headers: true, skip_blanks: true ).readlines
  • @majioa 我刚刚尝试过,但仍然有空行。我遍历了结果,仍然有四个空行显示如下,',,,'
  • 您应该避免在 ruby​​ IO 对象上使用 .new 除非您确定要关闭它,所以最好使用 .open 代替,readlines 代表读取哪些调用打开并在此处调用新视图源 @987654321 @
  • @GrahamJackson 这些行不为空 ',,,,' 是四个逗号分隔值

标签: ruby ruby-on-rails-3 csv import


【解决方案1】:

解决方案取决于您是否阅读带有或不带标题的 CSV,以及您是否想继续使用 CSV::Table 对象,或者您是否对 CSV::Row 数组感到满意

如果没有标题,您将获得如下所示的行:

[#<CSV::Row nil nil nil]

带有标题:

[#<CSV::Row "name":nil "abbreviation":nil "age":nil] 

解决方案

没有标题并返回 CSV::Row 数组

table.reject { |row| row.all?(&:nil?) }

没有标题并返回 CSV::Table

table.delete_if { |row| row.to_hash.values.all?(&:nil?) }

带有标题并返回 CSV::Row 数组

table.reject { |row| row.to_hash.values.all?(&:nil?) }

没有标题并返回 CSV::Table

table.delete_if { |row| row.to_hash.values.all?(&:nil?) }

进一步阅读

delete_if 的 Ruby 文档

【讨论】:

    【解决方案2】:

    这是我从 csv 中删除空行的方法:

    table = CSV.parse(csv_text, headers: true)
    table.delete_if { |row| row.to_hash.values.all?(&:blank?) }
    

    【讨论】:

      【解决方案3】:

      如果您还想过滤掉仅包含空格的列,请使用:

      row.all? { |column| column.nil? || column.strip.empty? }
      

      【讨论】:

        【解决方案4】:

        这将返回一个 CSV::Table 对象。

        CSV.parse(import_file, headers: true, skip_blanks: true).delete_if { |row| row.to_hash.values.all?(&:blank?) }

        【讨论】:

        • blank? 对我来说是一个不错的解决方案,然后适用于 ''、' ' 和 nil 行数据
        【解决方案5】:

        这应该可以工作

        CSV.open(import_file, skip_blanks: true).reject { |row| row.all?(&:nil?) }
        

        编辑

        您请求了 readlines,它最后在 CSV 源代码中调用 open 但就是这样:

        CSV.readlines(import_file, skip_blanks: true).reject { |row| row.all?(&:nil?) } 
        

        虽然我没有做任何板凳标记,但我觉得开放会表现更好

        CSV.open(import_file, skip_blanks: true, headers: true).reject { |row| row.to_hash.values.all?(&:nil?) }
        
        CSV.readlines(import_file, skip_blanks: true, headers: true).reject { |row| row.to_hash.values.all?(&:nil?) }
        

        上面返回一个 CSV::Row 对象的集合

        【讨论】:

        • 这是一个很好的答案,但无论如何都可以做同样的事情,但使用 readlines 代替。 (我宁愿坚持这一点,因为 csv 导入器取决于 readlines 提供数据的格式)。
        • @GrahamJackson 根据您的要求更新了使用 readlines 的答案,如果可行,您可以投票并接受答案吗?
        • 感谢您的帮助。这并不能解决我的问题,但我很感激并会投票,因为它可能会帮助其他人。我需要删除空值,但仍返回一个 CSV 对象。此解决方案将返回一个数组。
        • @GrahamJackson 让我修改更多,这样你就有了 csv 对象
        • 谢谢。您提供的新解决方案确实提供了 csv 对象的集合,但最终不会删除具有 nil 值的行。
        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-01-15
        • 2015-10-09
        • 2020-04-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多