Ruby 在代码运行之前,如何删除CSV文件中的多余双引号?

Ruby 在代码运行之前,如何删除CSV文件中的多余双引号?,ruby,csv,Ruby,Csv,我有一个CSV文件,我从一个网站导入,然后导出到另一个web应用程序 但是,在运行Ruby文件时,出现以下错误: C:\Users\ALilland\Documents\sinatra\csv_to_screen>ruby app.rb C:/Ruby22/lib/ruby/2.2.0/csv.rb:1843:in `block (2 levels) in shift': Missing or stray quote in line 762 (CSV::MalformedCSVError)

我有一个CSV文件,我从一个网站导入,然后导出到另一个web应用程序

但是,在运行Ruby文件时,出现以下错误:

C:\Users\ALilland\Documents\sinatra\csv_to_screen>ruby app.rb
C:/Ruby22/lib/ruby/2.2.0/csv.rb:1843:in `block (2 levels) in shift': Missing or
stray quote in line 762 (CSV::MalformedCSVError)
    from C:/Ruby22/lib/ruby/2.2.0/csv.rb:1836:in `each'
    from C:/Ruby22/lib/ruby/2.2.0/csv.rb:1836:in `block in shift'
    from C:/Ruby22/lib/ruby/2.2.0/csv.rb:1796:in `loop'
    from C:/Ruby22/lib/ruby/2.2.0/csv.rb:1796:in `shift'
    from C:/Ruby22/lib/ruby/2.2.0/csv.rb:1738:in `each'
    from C:/Ruby22/lib/ruby/2.2.0/csv.rb:1122:in `block in foreach'
    from C:/Ruby22/lib/ruby/2.2.0/csv.rb:1273:in `open'
    from C:/Ruby22/lib/ruby/2.2.0/csv.rb:1121:in `foreach'
    from app.rb:129:in `lost'
    from app.rb:157:in `scorecard'
    from app.rb:203:in `<main>' 
这是
irvine
上完全缺少引号的一个示例:

GS,GS,"REPLACE 1.5 DIELECTRIC UNION,IRVINE,"THE IRVINE CO. -  EXECU...",,Job162048,02/01/2016,0
这些“缺失或错失的引号”分散在整个CSV中,通常在
project\u name=row[2]

在运行
foreach
块之前,我可以做些什么来覆盖多余的引号

这是我发现的一篇与我的问题有关的帖子,但我一直在努力想如何实现它。这个错误在互联网上似乎有很好的记录,前几天我甚至听到了一个播客,但现在我正式遇到了第一手的问题,结果一无所获。“”

我的完整
foreach
块是:

def lost(initials, salesperson)
  my_status = 'Lost'
  lost = 0
  count = 0
  CSV.foreach(path1, :encoding => 'windows-1251:utf-8') do |row|
    salesman = row[0]
    project_manager = row[1]
    project_name = row[2]
    project_city = row[3]
    customer = row[4]
    status = row[6]
    if status[0,4] == 'Dead'
      status = 'Dead'
    end
    bid_date = Date.strptime(row[7], '%m/%d/%Y')
    amount = row[8].gsub(/(?<!^|,)"(?!,|$)/, '').tr(',', '').to_i

    next if salesman != initials || status != my_status || bid_date < fiscal_start
    dollar_amount = '$' + amount.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse
    lost = lost + amount
    count = count + 1
  end
   @lost_count = count.to_s
   @lost_amount = "$" + lost.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse
end
def丢失(姓名首字母、销售人员)
我的_状态=‘丢失’
丢失=0
计数=0
CSV.foreach(路径1:encoding=>'windows-1251:utf-8')do|行|
销售员=第[0]行
项目经理=行[1]
项目名称=行[2]
项目城市=行[3]
客户=第[4]行
状态=第[6]行
如果状态[0,4]=“已死亡”
状态=‘死亡’
结束
bid_date=date.strtime(第[7]行,'%m/%d/%Y')

amount=row[8].gsub(/(?让您的同事修复他的应用程序,使其生成有效的.csv(我知道这可能说起来容易做起来难,但如果必须处理正确的.csv,任何其他修复都可能导致代码中断)另外,发布一个有问题的.csv文件示例该应用程序是8年前由另一位PHP程序员开发的,该程序员很久以前就被解雇了:(,我们已经开始进行新的重写,完全放弃旧的,将在2017年2月完成,不幸的是,它仍然在使用中,使用excel中的数据变得陈旧。我正在sinatra中编写一个工具,以显示明年新应用完成时的报告。届时,您将无法使用CSV解析它;您必须重新编写将其作为文本添加并尝试自己进行解析(尽管从您给出的示例来看,这似乎是一项相当艰巨的任务)——Excel是否确实正确地读取了它?对于我的Excel选项,我基本上只需按编程方式打开并保存CSV,然后读取新的CSV?
def lost(initials, salesperson)
  my_status = 'Lost'
  lost = 0
  count = 0
  CSV.foreach(path1, :encoding => 'windows-1251:utf-8') do |row|
    salesman = row[0]
    project_manager = row[1]
    project_name = row[2]
    project_city = row[3]
    customer = row[4]
    status = row[6]
    if status[0,4] == 'Dead'
      status = 'Dead'
    end
    bid_date = Date.strptime(row[7], '%m/%d/%Y')
    amount = row[8].gsub(/(?<!^|,)"(?!,|$)/, '').tr(',', '').to_i

    next if salesman != initials || status != my_status || bid_date < fiscal_start
    dollar_amount = '$' + amount.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse
    lost = lost + amount
    count = count + 1
  end
   @lost_count = count.to_s
   @lost_amount = "$" + lost.to_s.reverse.gsub(/...(?=.)/,'\&,').reverse
end