2012-06-16 5 views
21

Sto provando a popolare l'oggetto filmato, ma durante l'analisi attraverso il file u.item ottengo questo errore:Rubino `split ': sequenza di byte non valida in UTF-8 (ArgumentError)

`split': invalid byte sequence in UTF-8 (ArgumentError)

File.open("Data/u.item", "r") do |infile| 
      while line = infile.gets 
       line = line.split("|") 
      end 
end 

Il l'errore si verifica solo quando si tenta di dividere le linee con una fantasia punteggiatura internazionale.

Qui c'è un esempio

543|Misérables, Les (1995)|01-Jan-1995||http://us.imdb.com/M/title-exact?Mis%E9rables%2C%20Les%20%281995%29|0|0|0|0|0|0|0|0|1|0|0|0|1|0|0|0|0|0|0

è un lavoro in giro ??

+1

Cosa significa 'od -c' dire circa la linea di domanda? –

+0

Funziona per me con il corpus come pubblicato. @ IgnacioVazquez-Abrams ha probabilmente ragione: devi usare un editor esadecimale per vedere se hai caratteri nascosti nel tuo file di dati. –

risposta

11

Ruby è un po 'sensibile ai problemi di codifica dei caratteri. Puoi fare una serie di cose che potrebbero risolvere il tuo problema. Ad esempio:

  1. Inserire un commento di codifica nella parte superiore del file di origine.

    # encoding: utf-8 
    
  2. Codificare in modo esplicito la linea prima della divisione.

    line = line.encode('UTF-8').split("|") 
    
  3. sostituire i caratteri non validi, invece di sollevare un'eccezione di codifica :: InvalidByteSequenceError.

    line.encode('UTF-8', :invalid => :replace).split("|") 
    

dare a questi suggerimenti un colpo, e aggiornare la tua domanda se nessuno di loro lavoro per voi. Spero che sia d'aiuto!

+3

No, non ha funzionato. Ho provato entrambe le soluzioni ... altre idee ... – user1452307

+1

L'errore che sta ottenendo implica che la codifica sia già UTF-8. –

+0

Quindi, ho controllato ogni riga prima che il programma tenti di dividerlo. Si scopre che l'errore si verifica in linee con punteggiature fantasia Ecco il record in cui si è verificato l'errore: 543 | Misérables, Les (1995) | 01-gen-1995 || http: //us.imdb .com/M/title-esatto Mis% E9rables% 2C% 20Les% 20% 281995% 29 |? 0 | 0 | 0 | 0 | 0 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 1 | 0 | 0 | 0 | 0 | 0 | 0 Ho provato anche la terza opzione, non ha funzionato ... Qualche idea? o modi alternativi ... – user1452307

19

ho dovuto forzare la codifica di ogni riga per iso-8859-1 (che è il set di caratteri europei) ... http://en.wikipedia.org/wiki/ISO/IEC_8859-1

a=[] 
IO.foreach("u.item") {|x| a << x} 
m=[] 
a.each_with_index {|line,i| x=line.force_encoding("iso-8859-1").split("|"); m[i]=x} 
+7

È possibile specificare la codifica che Ruby deve utilizzare quando si utilizza 'open', ad esempio 'File.open 'data.txt', 'r: iso-8859-1' do ...'. Vedi [i documenti] (http://ruby-doc.org/core-1.9.3/IO.html#method-c-new). – matt