Ruby 在代码运行之前,如何删除CSV文件中的多余双引号?
我有一个CSV文件,我从一个网站导入,然后导出到另一个web应用程序 但是,在运行Ruby文件时,出现以下错误: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)
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