Exception : Une citation inattendue à 1:2 (CSV::MalformedCSVError) Crystal

En essayant d'analyser un fichier de paiement Amazon, je suis tombé sur ce problème particulier :

Exception : Citation inattendue à 1:2 (CSV::MalformedCSVError)

La raison : Amazon Pay encode ses fichiers en UTF-8 avec BOM. Le BOM est un marqueur optionnel (dans les fichiers UTF-8). Vous pouvez le voir avec l'outil xxd par exemple

xxd apolish_amazon_2018DecMonthlyTransaction.csv | less

image

Les trois points au début du fichier sont la nomenclature. (EF BB BF en hexadécimal).

Traitement de la nomenclature

La définition d'un encodage de fichier différent ne sera malheureusement pas utile, car iconv semble transmettre la nomenclature sans modification.

Il n'y a pas de variations d'encodage "spéciales" que vous pourriez utiliser, cf. ma liste pour iconv ici.

Nous devons donc le supprimer en lisant trois octets.

apf = File.open(mon_filename)

discard = apf.gets(3)

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

Pour en savoir plus :