在rails应用程序中导入CSV时忽略具有空值的行

时间:2013-12-18 05:00:51

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

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

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

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

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

谢谢!

5 个答案:

答案 0 :(得分:7)

这应该有效

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对象的集合

答案 1 :(得分:6)

这将返回CSV :: Table对象。

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

答案 2 :(得分: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文档

答案 3 :(得分:0)

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

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

答案 4 :(得分:0)

以下是我如何管理从csv删除空行:

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