Eccezione: Citazione inattesa a 1:2 (CSV::MalformedCSVError) Crystal

Mentre cercavo di analizzare un file di pagamento Amazon, mi sono imbattuto in questo particolare problema:

Eccezione: Citazione inattesa a 1:2 (CSV::MalformedCSVError)

Il motivo: Amazon Pay codifica i suoi file in UTF-8 con BOM. Il BOM è un marcatore opzionale (nei file UTF-8). Potete vederlo con lo strumento xxd per esempio

xxd apolish_amazon_2018DecMonthlyTransaction.csv | less

immagine

I tre punti all'inizio del file sono la BOM. (EF BB BF in Hex).

Trattare con la BOM

Impostare una codifica diversa per i file purtroppo non aiuta, poiché iconv sembra passare la BOM inalterata.

Non ci sono variazioni di codifica "speciali" che potresti usare, vedi la mia lista per iconv qui.

Quindi dobbiamo rimuoverlo leggendo tre byte.

apf = File.open(my_filename)

scartare = apf.gets(3)

mette (discard.inspect)
apf.set_encoding("UTF-8", nil)

Ulteriori letture: