Как удалить случайные двойные кавычки в CSV-файле перед запуском моего кода?

У меня есть файл 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

person ADL    schedule 29.03.2016    source источник
comment
Попросите вашего коллегу исправить его приложение, чтобы оно генерировало действительный .csv (я знаю, что это может быть легче сказать, чем сделать, но любые другие исправления могут привести к поломке вашего кода, если ему когда-либо придется обрабатывать правильный .csv)   -  person antlersoft    schedule 30.03.2016
comment
Кроме того, опубликуйте пример проблемного файла .csv.   -  person antlersoft    schedule 30.03.2016
comment
приложение было сделано 8 лет назад другим программистом на PHP, этот программист был давно уволен :(, с тех пор мы начали работу над новым переписыванием, полностью отказавшись от старого, и это будет сделано в феврале 2017 года, к сожалению, это еще очень много в использовании и использовании данных в excel устарели. я пишу инструмент в sinatra для отображения отчетов на следующий год, когда наше новое приложение будет готово   -  person ADL    schedule 30.03.2016
comment
Тогда вы не сможете проанализировать его с помощью CSV; вам придется прочитать его как текст и попытаться выполнить синтаксический анализ самостоятельно (хотя из примеров, которые вы привели, кажется, что это будет довольно сложной задачей) - Действительно ли Excel читает его правильно?   -  person antlersoft    schedule 30.03.2016
comment
да, excel нормально читает   -  person ADL    schedule 30.03.2016
comment
Вы можете либо использовать Excel, чтобы исправить проблему, которую Ruby может написать сценарий, либо использовать Ruby исключительно для открытия, разделения строк запятыми, что очень подвержено ошибкам, а затем перестроить их с помощью CSV. При обработке проблем с данными требуется много знаний в предметной области, чтобы решить проблему. CSV особенно склонен к неправильной генерации, потому что люди предполагают, что они понимают спецификацию, а затем всплывают краеугольные случаи, которые уничтожает код.   -  person the Tin Man    schedule 30.03.2016
comment
для моего варианта Excel я бы просто программно открыл и сохранил CSV и прочитал новый CSV?   -  person ADL    schedule 30.03.2016