当列为空时,是否可以忽略或替换为空字符串? 我的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”的所有行。 谁能帮我?感谢
答案 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"