Uso una aplicación de iPhone que me envía un correo electrónico periódicamente en formato CSV. Tengo un script de ruby que resume los datos en ese registro con registros más antiguos. Recientemente, el desarrollador de la aplicación lanzó una actualización que, por algún motivo desconocido, agregó un retorno de carro al final de cada línea, lo que provocó el error de mi secuencia de comandos. De acuerdo con los documentos, :row_end
de forma predeterminada debería ser :auto
, que debería aceptar \r\n
o \n
(en 1.9.2). He intentado usar Ruby 1.8.7, 1.9.2 y FasterCSV con 1.8.7. Consigo varios mensajes de error con estos diferentes intentos, incluyendoRuby CSV no comprende r n como fila final
CSV::IllegalFormatError
- campos Unquoted no permiten
\r
o\n
(línea 1) (FasterCSV::MalformedCSVError
) - no puede dup
NilClass
(TypeError)
en 1.9.2. (El \r
no se encuentra en un campo, que es el final de la línea!) Los datos que antes era la siguiente:
03-12-2012 07:59,120.0,
03-11-2012 08:27,120.0,
03-10-2012 07:57,120.0,
Ahora parece que esto:
03-12-2012 07:59,120.0,^M
03-11-2012 08:27,120.0,^M
03-10-2012 07:57,120.0,^M
Pensando que CSV puede estar pensando la ^M
es en el último campo, he intentado añadir otro coma:
03-12-2012 07:59,120.0,,^M
en vano.
Lo único que puedo imaginar es que CSV requiere que todos los campos estén entre comillas dobles? Puedo pensar en varias soluciones, como leer primero el archivo, masticar los extremos y luego procesar la matriz con CSV, pero primero quiero saber qué estoy haciendo mal. Parece que debería funcionar.
Por cierto mi código es simplemente:
CSV.foreach(File.join($import_dir, file)) do |record|
y He tratado de establecer :row_end => "\r\n"
en vano.
Estoy en Mac OS X 10.6.8.
Gracias por el consejo. No había pensado en mirar el archivo con od. Resulta que la línea termina en \ r \ r \ n. – chetstone