我有一个允许用户导入CSV数据的应用。
一切正常,直到用户开始导入CSV文件中包含空白行的数据。我正在使用以下内容从CSV文件中获取行:
CSV.readlines(import_file, headers: true, skip_blanks: true)
我认为如果我添加了skip_blanks的选项,它会这样做,但它没有。关于如何忽略空白行的任何想法。
谢谢!
答案 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?) }
进一步阅读
的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?) }