2014-02-11 68 views
2

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

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

所以不是所有的列都填满。有几个空的列。它retunrs错误:

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”行应删除。 任何人都可以帮助我吗?谢谢

+0

你是如何收集'csv_contents',表明部分也.. –

+0

@ArupRakshit好吧。我马上去做 – ishwr

+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) 
+0

谢谢@Sergio。那帮了我 – ishwr

+0

@catwoman如果这个答案对你有帮助,你应该考虑接受它。 – Abdo

+0

是的,我当然会的。我不能这样做,只好等8分钟@阿博 – ishwr

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"