Voici le code qui fonctionne chez moi. “import” est la méthode appelée
dans mon controller qui elle-même fait appel aux méthodes “convert” et
“analyze”. En bonus, t’as la gestion de l’encoding (merci à Éric
Jacoboni de m’avoir conseiller charguess) et la gestion des champs du
fichier CSV.
def import
if params[:data].size.zero?
flash[:warn] = ‘Vous avez oublié de choisir un fichier.’
render :action => ‘new’
return
else
params[:data].rewind # Make sure Tempfile / StringIO is at start
of data
data = convert params[:data].string
analyze data
redirect_to :controller => “XXXXXXXX”, :action => “list”
end
end
#charset conversion
def convert txt
input_encoding = CharGuess::guess txt
input_encoding != “UTF-8” ? Iconv.new(“UTF-8”,
input_encoding).iconv(txt) : txt
end
#data analysis
def analyze data
csv_reader = CSV::Reader.create(data)
first_line = csv_reader.shift
lastname_column = first_line.index(“Nom”)
firstname_column = first_line.index(“Prénom”)
email_column = first_line.index(“Adresse de messagerie”)
csv_reader.each{ |row|
lastname = row[lastname_column]
firstname = row[firstname_column]
email = row[email_column]
#ici on fait le traitement des données
}
end
Le lundi 13 novembre 2006 à 21:57 +0100, philippe lachaise a écrit :
J’upload un fichier CSV d’adresses e-mail
Un CSV provenant de gmail acceppte de s’uploader (mais contient un
encoding à problème)
Tous les autres CSV (format outlook, yahoo) provoquent une exception !
Renommage des fichiers, grattage de cuir chevelu, tentative avec
breakpointer qui refuse tout service sous XP, bon !
Mauvaise plateforme de dev, changer plateforme.
CSV autre => StringIO
Donc, au bon vouloir du serveur (ou da Rails ?) on reçoit des objet de
types distincts ?!
Le type dépend de la taille du fichier uploadé, mais en Ruby, on peut se
permettre de ne pas connaitre la class de l’object (cf prochain
paragraphe).
Je recode :
uploaded = params[:import_csv_file]
if uploaded.is_a? StringIO
render :inline => uploaded.read
elsif uploaded.is_a? Tempfile
render :inline => uploaded.path
end
Ce qui viole le duck typing et est un peu dommage.
++
yk