ruby on rails - rails - CSV: los campos sin comillas no permiten / r o / n(línea 2)
rails 5 send_data csv (8)
Intentando analizar un archivo CSV, pero aún aparece el mensaje de error Los campos sin comillas no permiten / r o / n (línea 2). .
Encontré aquí en un tema tan similar, donde había una pista para hacer lo siguiente:
CSV.open(''file.csv'', :row_sep => "/r/n") do |csv|
pero su desafortunadamente no me funciona ... No puedo cambiar el archivo CSV, así que necesitaría arreglarlo en el código.
EDITAR muestra de archivo CSV:
A;B;C
1234;...
¿Hay alguna forma de hacerlo?
¡Muchas gracias!
En mi caso, la primera fila de la hoja de cálculo / CSV fue un bit de introducción de doble comilla. El error que obtuve fue: /Users/.../.rvm/rubies/ruby-2.3.0/lib/ruby/2.3.0/csv.rb:1880:in `bloque (2 niveles) in shift '': sin comillas los campos no permiten / r o / n (línea 1). (CSV :: MalformedCSVError)
Borre el comentario con "caracteres para que .csv SOLAMENTE tuviera los datos .csv, los guardé y mi programa funcionó sin errores.
En mi caso, tuve que proporcionar codificación y un carácter de cotización que garantizaba que no ocurriera en los datos.
CSV.read("file.txt", ''rb:bom|UTF-16LE'', {:row_sep => "/r/n", :col_sep => "/t", :quote_char => "/x00"})
En primer lugar, debe establecer los delimitadores de columna en '';'', ya que no es la forma habitual de analizar los archivos CSV. Esto funcionó para mí:
CSV.open(''file.csv'', :row_sep => :auto, :col_sep => ";") do |csv|
csv.each { |a,b,c| puts "#{a},#{b},#{c}" }
end
A partir de la 1.9.2 documentación CSV:
El descubrimiento automático lee hacia adelante en los datos en busca de la siguiente secuencia
/r/n
,/n
o/r
. Se seleccionará una secuencia incluso si ocurre en un campo entre comillas, suponiendo que tendría los mismos finales de línea allí.
Me doy cuenta de que esta es una publicación antigua, pero recientemente tuve un problema similar con un archivo CSV mal formateado que no se pudo analizar con la biblioteca estándar de Ruby CSV.
SmarterCSV gema SmarterCSV que analizó el archivo en ningún momento. Es una biblioteca externa, por lo que podría no ser la mejor solución para todos, pero es mejor que analice el archivo yo mismo.
opts = { col_sep: '';'', file_encoding: ''iso-8859-1'', skip_lines: 5 }
SmarterCSV.process(file, opts).each do |row|
p row[:someheader]
end
Otra solución simple para corregir el extraño formato causado por Excel es copiar y pegar los datos en la hoja de cálculo de Google y luego descargarlos como un CSV.
Para mí estaba importando LinkedIn CSV y obtuve el error.
Quité las líneas en blanco como esta:
def import
csv_text = File.read(''filepath'', :encoding => ''ISO-8859-1'')
#remove blank lines from LinkedIn
csv_text = csv_text.gsub /^$/n/, ''''
@csv = CSV.parse(csv_text, :headers => true, skip_blanks: true)
end
Si tiene que lidiar con archivos que vienen de Excel con nuevas líneas en las celdas, también hay una solución.
La gran desventaja de esta manera es que no se permiten puntos y comas ni comillas dobles en las cadenas.
Elijo ir sin punto y coma
if file.respond_to?(:read)
csv_contents = file.read
elsif file_data.respond_to?(:path)
csv_contents = File.read(file.path)
else
logger.error "Bad file_data: #{file_data.class.name}: #{file_data.inspect}"
return false
end
result = "string"
csv_contents = csv_contents.force_encoding("iso-8859-1").encode(''utf-8'') # In my case the files are latin 1...
# Here is the important part (Remove all newlines between quotes):
while !result.nil?
result = csv_contents.sub!(/(/"[^/;]*)[/n/r]([^/;]*/")/){$1 + ", " + $2}
end
CSV.parse(csv_contents, headers: false, :row_sep => :auto, col_sep: ";") do |row|
# do whatever
end
Para mí, la solución funciona bien, si maneja archivos grandes, podría tener problemas con ella.
Si desea ir sin comillas, simplemente reemplace los puntos y comas en la expresión regular con comillas.
Una solución más simple si el CSV fue tocado o guardado por cualquier programa que puede haber usado un formato extraño (como Excel o Hoja de cálculo):
- Abra el archivo con cualquier editor de texto plano (utilicé Sublime Text 3)
- Presione la tecla enter para agregar una nueva línea en cualquier lugar
- Guarda el archivo
- Eliminar la línea que acaba de agregar
- Guarda el archivo de nuevo
- Intente la importación de nuevo, el error debería haberse ido.