У меня есть файл CSV, который я импортирую с одного сайта и экспортирую в другое веб-приложение.
Однако при запуске моего файла 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>'
Это пример, когда в моих данных "GENERAL CONTRACTOR, ..."
не должно быть цитаты:
MM,MM,"VENABLE, LLP","LOS ANGELES","GENERAL CONTRACTOR, ...",,Dead,02/11/2016,0
Это пример полностью отсутствующих кавычек на irvine
:
GS,GS,"REPLACE 1.5 DIELECTRIC UNION,IRVINE,"THE IRVINE CO. - EXECU...",,Job162048,02/01/2016,0
Эти «отсутствующие или случайные кавычки» разбросаны по всему CSV-файлу, обычно в project_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