2017-09-26 2 views
1

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">] 

Github Gist

Download Example CSV File

Répondre

1
path = Rails.root.join('data', 'mike/test-csv.csv') 
file = "" 

File.open(path, 'r') do |csv| 
    csv.each_line do |line| 
    file << line.gsub(/\u0000/, '') 
    end 
end 
print file 
print file.inspect # same as above just wraps the string in a 
        # single line with "\n" chars 
+0

merci pour le commentaire! Malheureusement, cela ne fonctionne pas :(Je vais mettre à jour mon post avec les résultats –

+0

bien, comment un exemple chaîne de sortie ressemblerait? – ashmaroli

+0

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