2013-05-27 5 views
16

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

+1

Verwendet die von Ihnen bereitgestellten Beispieldaten und das Parsing funktioniert gut.Es wird keine CSV :: MalformedCSVError: Unzulässige Zitat in Zeile 1 Fehler. –

+0

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. –

+3

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") ' –

Antwort

-3

diesen Hinweis Versuchen:

  1. Öffnen Sie Ihre CSV f ile in einem Texteditor
  2. Wählen Sie die gesamte Datei und kopieren Sie sie
  3. Öffnen Sie eine neue Textdatei
  4. die CSV-Daten in die neue Datei einfügen und Speichern Sie die neue Datei
  5. Importieren Sie Ihre neue CSV-Datei
+0

CSV-Datei könnte in MBs sein, die nicht so geöffnet werden können – user1735921

20
quote_chars = %w(" | ~^& *) 
begin 
    @report = CSV.read(csv_file, headers: :first_row, quote_char: quote_chars.shift) 
rescue CSV::MalformedCSVError 
    quote_chars.empty? ? raise : retry 
end 

es ist nicht perfekt, aber es funktioniert die meiste Zeit.

N.B. CSV.parse nimmt die gleichen Parameter wie CSV.read, so dass entweder eine Datei oder Daten aus dem Speicher verwendet werden können

10

Ich hatte gerade ein Problem wie dieses und entdeckte, dass CSV Leerzeichen zwischen dem col-sep und dem Anführungszeichen nicht mag. Sobald ich das entfernte alles ging gut. So hatte ich:

12, "N", 12, "Pacific/Majuro" 

aber sobald ich die Räume mit

.gsub(/,\s+\"/,',\"') 

in resultierenden

12,"N", 12,"Pacific/Majuro" 

alles gsubed aus ging gut.

+1

Hinweis, wenn Sie Leerzeichen auf beiden Seiten der Zeichenfolge in Anführungszeichen innerhalb Komma-Wert ersetzen möchten ... gsub (/, \ s + \ "/, ',"'). gsub (/ \ "\ s +, /, '",') – bjm88

11

Anand, danke für den Codierungsvorschlag. Dies löste das illegale Angebotsproblem für mich.

Hinweis: Wenn Sie der Iterator überspringen, die Kopfzeile hinzufügen headers: :first_row wollen, etwa so:

CSV.foreach("test.csv", encoding: "bom|utf-8", headers: :first_row) 
+0

Danke! 'encoding:" bom | utf-8 "' hat mein Problem gelöst. –

1

hatte ich ein Problem mit der Marke Charakter, der diesen Fehler wirft.

Das Markenzeichen Zeichen übersetzt "in UTF-8 \, so dass er das offene Zitat Symbol war, der den Fehler warf Also tat ich dies:.

.gsub!("\"!", "")

Und dann habe ich versucht, Erstellen Sie mein CSV-Objekt und es hat gut funktioniert

Verwandte Themen