Ruby CSV:忽略空列

时间:2014-02-11 14:58:13

标签: ruby string csv

当列为空时,是否可以忽略或替换为空字符串? 我的CSV看起来像这样:

"DE","Klasse","Deutsch", "x"
"EN","Class","Carpenter",
"DE","Klasse","Mathe",
,,,

因此并非所有列都已填充。有几个空列。它重新发出错误:

TypeError: no implicit conversion of nil into String

我做的是:

csv_contents = CSV.read("path_to_csv", options)
str=["local, type, name"]
csv_contents.each_with_index do |row, i|
if row[3]==nil
  str << row[0] + ", " + row[1] + ", " + row[2] 
end
end

端 我必须修改csv,因为应删除最后一列中包含“x”的所有行。 谁能帮我?感谢

2 个答案:

答案 0 :(得分:1)

您可以添加一个方法来检查值是否为零。如果是这样,请返回“”。

def get_row(row, i)
  row.nil? ? "" : row[i]
end

然后,在您的代码中使用它:

str << get_row(row, 0) + ", " + get_row(row, 1) + ", " + get_row(row, 2)

答案 1 :(得分:1)

  

当列为空时,是否可以忽略或替换为空字符串?

如果您有foo,,bar,这样的行,则表示这些列空白。是的,你是对的,但空白表示那些已经空字符串"")。这里没有意义,用空字符串替换空字符串 :-)。无论如何,当你将这些数据保存在输出文件中时,你可以明显地忽略它们。

  

因为应删除最后一列中包含“x”的所有行。

毫无疑问,这是可能的。

这是怎么做的,我会这样做:

require 'csv'

input_file_path = File.expand_path('input.csv',File.dirname(__FILE__))
output_file_path = File.expand_path('output.csv',File.dirname(__FILE__)) 

option = { :skip_blanks => true, 
           :quote_char => "\'", 
           :converters => lambda do |field|
             field.to_s.tr('"','')
           end
         }

CSV.open(output_file_path,'w',:force_quotes => true) do |out_row|
  CSV.foreach(input_file_path, option) do |in_row|
    row_to_add = in_row.reject(&:empty?)
    unless row_to_add.empty?
      row_to_add.last[/^\s*x$/i] ? out_row.puts(row_to_add[0..-2]) : out_row.puts(row_to_add)
    end
  end
end

<强>输出

"DE","Klasse","Deutsch"
"EN","Class","Carpenter"
"DE","Klasse","Mathe"