Cela aurait dû être une chose si facile ... Je ne peux pas acheter pour la vie de me comprendre comment analyser un fichier CSV qui ne semble pas avoir un codage spécifique.Parse fichier CSV binaire Ruby
File.open(Rails.root.join('data', 'mike/test-csv.csv'), 'rb') { |f| f.read }
=> "ID,\x00Q\x00u\x00a\x00n\x00t\x00i\x00t\x00y\n\x006\x00e\x005\x004\x009\x001\x00e\x007\x00-\x007\x00f\x001\x005\x00-\x004\x001\x007\x00d\x00-\x00a\x004\x000\x003\x00-345\x00,\x00\x005\x000\x00.\x000\x000\x000\x000\x000\x000\x000\x000\x00\n"
Voici une idée générale, impossible de trouver un moyen d'afficher le fichier CSV spécifique.
Tout ce que je reçois de vérifier l'encodage du fichier est qu'il est au format binaire, des idées sur la façon dont je pourrais l'obtenir dans un csv normal?
Note: Ceci est un fichier CSV afin de le convertir en un autre encodage par l'ouverture dans Excel et d'exportation (ou quelque chose comme ça) téléchargé n'est pas une option :)
Merci!
Mise à jour avec tentative de solution 1:
path = Rails.root.join('data', 'mike/test-csv.csv')
CSV.read(path, {:headers => true, :encoding => 'utf-8'}).each do |d|
puts d
end
Result: 6e5491e7-7f15-417d-a403-345,50.00000000
Bien que ce soit correct, il fonctionne UNIQUEMENT avec puts
, par exemple:
CSV.read(path, {:headers => true, :encoding => 'utf-8'}).map { |row| row }
=> [#<CSV::Row "ID":"\u00006\u0000e\u00005\u00004\u00009\u00001\u0000e\u00007\u0000-\u00007\u0000f\u00001\u00005\u0000-\u00004\u00001\u00007\u0000d\u0000-\u0000a\u00004\u00000\u00003\u0000-345\u0000" "\u0000Q\u0000u\u0000a\u0000n\u0000t\u0000i\u0000t\u0000y":"\u0000\u00005\u00000\u0000.\u00000\u00000\u00000\u00000\u00000\u00000\u00000\u00000\u0000">]
CSV.read(path, {:headers => true, :encoding => 'utf-8'}).map(&:to_s)
=> ["\u00006\u0000e\u00005\u00004\u00009\u00001\u0000e\u00007\u0000-\u00007\u0000f\u00001\u00005\u0000-\u00004\u00001\u00007\u0000d\u0000-\u0000a\u00004\u00000\u00003\u0000-345\u0000,\u0000\u00005\u00000\u0000.\u00000\u00000\u00000\u00000\u00000\u00000\u00000\u00000\u0000\n"]
Il est malheureusement toujours pas la chaîne correcte :(
Solution finale (via @ashmaroli ci-dessous):
path = Rails.root.join('data', 'mike/test-csv.csv')
csv_text = ''
File.open(path, 'r') do |csv|
csv.each_line do |line|
csv_text << line.gsub(/\u0000/, '')
end
end
CSV.parse(csv_text, headers:true).map do |row| row end
Résultat:
[#<CSV::Row "ID":"6e5491e7-7f15-417d-a403-345" "Quantity":"50.00000000">]
merci pour le commentaire! Malheureusement, cela ne fonctionne pas :(Je vais mettre à jour mon post avec les résultats –
bien, comment un exemple chaîne de sortie ressemblerait? – ashmaroli
si les sorties de commande 'puts' la chaîne de droite, alors peut-être ce qui suit devrait fonctionner aussi bien : ** 'CSV.read (chemin, {: headers => vrai,: encoding => 'utf-8'}). Map (&: to_s)' ** – ashmaroli