Ubuntu 12.04 LTSRubin nicht in der Lage eine CSV-Datei zu analysieren: CSV :: MalformedCSVError (Illegal in Zeile zitiert 1.)
Rubin Rubin 1.9.3dev (2011-09-23 Revision 33323) [i686- linux]
Rails 3.2.9
Es folgt der Inhalt meiner empfangenen CSV-Datei:
"date/time","settlement id","type","order id","sku","description","quantity","marketplace","fulfillment","order city","order state","order postal","product sales","shipping credits","gift wrap credits","promotional rebates","sales tax collected","selling fees","fba fees","other transaction fees","other","total"
"Mar 1, 2013 12:03:54 AM PST","5481545091","Order","108-0938567-7009852","ALS2GL36LED","Solar Two Directional 36 Bright White LED Security Flood Light with Motion Activated Sensor","1","amazon.com","Amazon","Pasadena","CA","91104-1056","43.00","3.25","0","-3.25","0","-6.45","-3.75","0","0","32.80"
aber wenn ich versuche, die CSV-Datei, die ich Störung erhalte zu analysieren:
1.9.3dev :016 > options = { col_sep: ",", quote_char:'"' }
=> {:col_sep=>",", :quote_char=>"\""}
1.9.3dev :022 > CSV.foreach("/tmp/my_data.csv", options) { |row| puts row }
CSV::MalformedCSVError: Illegal quoting in line 1.
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1925:in `block (2 levels) in shift'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1887:in `each'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1887:in `block in shift'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1849:in `loop'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1849:in `shift'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1791:in `each'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1208:in `block in foreach'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1354:in `open'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1207:in `foreach'
from (irb):22
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/bin/irb:16:in `<main>'
Dann habe ich versucht, die Daten also
"name","age","email"
"jignesh","30","[email protected]"
jedoch
Vereinfachung noch ich die gleiche Störung erhalte:
1.9.3dev :023 > CSV.foreach("/tmp/my_data.csv", options) { |row| puts row }
CSV::MalformedCSVError: Illegal quoting in line 1.
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1925:in `block (2 levels) in shift'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1887:in `each'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1887:in `block in shift'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1849:in `loop'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1849:in `shift'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1791:in `each'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1208:in `block in foreach'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1354:in `open'
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/lib/ruby/1.9.1/csv.rb:1207:in `foreach'
from (irb):23
from /home/jigneshgohel/.rvm/rubies/ruby-1.9.3-rc1/bin/irb:16:in `<main>'
Wieder versuchte ich die Daten wie folgt vereinfacht:
name,age,email
jignesh,30,[email protected]
und es works.See die Ausgabe unter:
1.9.3dev :024 > CSV.foreach("/tmp/my_data.csv") { |row| puts row }
name
age
email
jignesh
30
[email protected]
=> nil
Aber ich werde die CSV-Dateien werden empfangen, um Daten angegeben hat Anführungszeichen Lösung entfernt ist nicht wirklich herauszufinden, ich bin auf der Suche for.I nicht in der Lage ist zu Was verursacht den Fehler: CSV :: MalformedCSVError: Illegale Zitate in Zeile 1. in meinen früheren Beispielen.
Ich habe überprüft, dass in der CSV gibt es keine führenden/nachgestellten Leerzeichen durch Aktivieren von "Leerzeichen anzeigen" und "Show Line Endings" in meinem Texteditor. Auch ich habe die Codierung mit folgenden überprüft.
1.9.3dev :026 > File.open("/tmp/my_data.csv").read.encoding
=> #<Encoding:UTF-8>
Hinweis: Ich habe versucht, mit dieser Methode CSV.read auch, aber denselben Fehler verwenden.
Kann mir bitte jemand helfen, das Problem zu lösen und mir zu erklären, wo es falsch läuft?
=====================
ich nur an folgenden Beitrag gefunden: http://www.ruby-forum.com/topic/448070 und versucht folgende:
file_data = file.read
file_data.gsub!('"', "'")
arr_of_arrs = CSV.parse(file_data)
arr_of_arrs.each do |arr|
Rails.logger.debug "=======#{arr}"
end
und bekam die folgende Ausgabe:
=======["\xEF\xBB\xBF'date/time'", "'settlement id'", "'type'", "'order id'", "'sku'", "'description'", "'quantity'", "'marketplace'", "'fulfillment'", "'order city'", "'order state'", "'order postal'", "'product sales'", "'shipping credits'", "'gift wrap credits'", "'promotional rebates'", "'sales tax collected'", "'selling fees'", "'fba fees'", "'other transaction fees'", "'other'", "'total'"]
=======["'Mar 1", " 2013 12:03:54 AM PST'", "'5481545091'", "'Order'", "'108-0938567-7009852'", "'ALS2GL36LED'", "'Solar Two Directional 36 Bright White LED Security Flood Light with Motion Activated Sensor'", "'1'", "'amazon.com'", "'Amazon'", "'Pasadena'", "'CA'", "'91104-1056'", "'43.00'", "'3.25'", "'0'", "'-3.25'", "'0'", "'-6.45'", "'-3.75'", "'0'", "'0'", "'32.80'"]
, die die Daten korrekt als Standard col_sep verwendet Lesen durcheinander ist ein komma~~POS=TRUNC. Allerdings habe ich versucht, quote_char Option wie folgt aus:
arr_of_arrs = CSV.parse(file_data, :quote_char => "'")
aber es endete die folgende Fehlermeldung auf:
CSV::MalformedCSVError (Illegal quoting in line 1.):
Danke, Jignesh
Verwendet die von Ihnen bereitgestellten Beispieldaten und das Parsing funktioniert gut.Es wird keine CSV :: MalformedCSVError: Unzulässige Zitat in Zeile 1 Fehler. –
In meinem bearbeiteten Abschnitt die Ausgabe enthält folgendes: "\ xEF \ xBB \ xBF'date/time '". Stellt es ein Problem dar? Ich weiß nicht, was es darstellt.T hanks. –
Die Unicode-Zeichen am Anfang der Datei sind BOM (Byte Order Mark). Sie können versuchen, sub!(/^\ xEF \ xBB \ xBF /, '') 'oder' CSV.foreach ("test.csv", Codierung: "bom | utf-8") ' –