11 votes

Ruby : impossible d'analyser un fichier Excel exporté en CSV sous OS X

J'utilise la bibliothèque CSV de Ruby pour analyser un fichier CSV. J'ai un fichier CSV apparemment bien formé que j'ai créé en exportant un fichier Excel au format CSV.

Cependant CSV.open(filename, 'r') provoque un CSV::IllegalFormatError .

Il n'y a pas de virgules ou de guillemets indésirables dans le fichier, ni rien d'autre que je puisse voir qui pourrait causer des problèmes.

Je pense que le problème pourrait être lié aux fins de ligne. Je suis capable d'analyser les données saisies manuellement via un éditeur de texte (Aquamacs). Ce n'est que lorsque j'essaie avec des données exportées d'Excel (pour OS X) que les problèmes surviennent. Quand j'ouvre le CSV exporté dans vim, tout le texte apparaît sur une seule ligne, avec ^M apparaissant entre les lignes.

D'après les documents, il semble que vous pouvez fournir open avec un séparateur de ligne ; cependant, je ne suis pas sûr de ce qu'il doit être dans ce cas.

35voto

DigitalRoss Points 80400

Essayez : CSV.open('filename', 'r', ?,, ?\r)

Comme cantine notes, pour Ruby 2 c'est :

CSV.new('file.csv', 'r', :col_sep => ?,, :row_sep => ?\r)

Je suis presque sûr qu'ils vont vous faire un DTRT. Vous pouvez également "réparer" le fichier lui-même (dans ce cas, gardez l'ancien fichier open ) avec les éléments suivants vim commandement : :%s/\r/\r/g

Oui, je sais que cette commande a l'air totalement inutile, mais elle va fonctionner.

5voto

Brian Armstrong Points 8259

Décapage \r les caractères semblent fonctionner pour moi

CSV.parse(File.read('filename').gsub(/\r/, ' ')) do |row|
  ...
end

4voto

Alex Kahn Points 436

Une autre option consiste à ouvrir le fichier CSV ou la feuille de calcul originale dans Excel et à l'enregistrer en tant que "Windows Comma Separated" plutôt que "Comma Separated Values". Cela permettra d'obtenir un fichier avec des fins de ligne que FasterCSV est capable de comprendre.

0voto

John Machin Points 39706

""" Lorsque j'ouvre le CSV exporté dans vim, tout le texte apparaît sur une seule ligne, avec ^M entre les lignes.

D'après la documentation, il semble que l'on puisse fournir un séparateur de ligne à open, mais je ne suis pas sûr de ce qu'il doit être dans ce cas. """

Relire une phrase ... ^M signifie Ctrl-M du clavier alias ' \x0D ' (M est la 13e lettre de l'alphabet ASCII ; 0x0D == 13) alias ASCII CR (carriage return) alias ' \r ' ... C'est-à-dire ce que les Macs utilisaient comme terminaison de ligne avant OS X.

0voto

chesterbr Points 1168

Il semble que les versions plus récentes de l'analyseur CSV et/ou de tout composant qu'il utilise lisent les fins de ligne DOS/Windows sans problème. L'analyseur standard de Mac OS X (je ne suis pas sûr de la version) ne fonctionnait pas, j'ai installé Ruby 2.0.0 et il a analysé le fichier sans problème, sans les arguments spéciaux...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X