【问题标题】:Ruby CSV: ignoring empty columnRuby CSV:忽略空列
【发布时间】:2014-02-11 14:58:12
【问题描述】:

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

【问题讨论】:

  • 你是怎么收集到csv_contents的,也显示那部分..
  • @ArupRakshit 好吧。我马上就做

标签: ruby string csv


【解决方案1】:

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

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

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

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

【讨论】:

  • @catwoman 如果这个答案对你有帮助,你应该考虑接受它。
  • 是的,我当然会。我以前做不到,不得不等待 8 分钟 @Abdo
  • @Abdo 也看看我的 :-)
【解决方案2】:

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

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

因为应该删除最后一列有“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"

【讨论】:

    猜你喜欢
    • 2019-12-21
    • 1970-01-01
    • 2011-12-14
    • 1970-01-01
    • 1970-01-01
    • 2021-08-21
    • 1970-01-01
    • 1970-01-01
    • 2014-04-23
    相关资源
    最近更新 更多