Excepción: Cita inesperada en 1:2 (CSV::MalformedCSVError) Crystal

Mientras trataba de analizar un archivo de pago de Amazon, me encontré con este problema en particular:

Excepción: Cita inesperada en 1:2 (CSV::MalformedCSVError)

La razón: Amazon Pay codifica sus archivos en UTF-8 con BOM. El BOM es un marcador opcional (en archivos UTF-8). Puedes verlo con la herramienta xxd por ejemplo

xxd apolish_amazon_2018DecMonthlyTransaction.csv | menos

imagen

Los tres puntos al principio del archivo son la lista de materiales. (EF BB BF en Hex).

Cómo lidiar con la lista de materiales

Establecer una codificación de archivo diferente no ayudará, ya que iconv parece pasar la lista de materiales sin cambios.

No hay variaciones de codificación "especiales" que pueda utilizar, véase mi lista para iconv aquí.

Por lo tanto, tenemos que eliminarlo leyendo tres bytes.

apf = File.open(my_filename)

descartar = apf.gets(3)

puts (descarte.inspeccionar)
apf.set_encoding("UTF-8", nil)

Más información: