Je sais que je l'ai déjà fait et que j'ai trouvé un simple ensemble de code, mais je ne m'en souviens pas ou ne le trouve pas :(.
J'ai un fichier texte d'enregistrements que je veux importer dans mon Rails 3 application.
Chaque ligne représente un enregistrement. Potentiellement, il peut être délimité par des tabulations pour les attributs, mais cela ne me dérange pas non plus avec une seule valeur.
Comment puis-je faire cela?
File.open("my/file/path", "r").each_line do |line|
# name: "Angela" job: "Writer" ...
data = line.split(/\t/)
name, job = data.map{|d| d.split(": ")[1] }.flatten
end
Sujet connexe
Quelles sont toutes les façons courantes de lire un fichier en Ruby?
Tu veux IO.foreach
:
IO.foreach('foo.txt') do |line|
# process the line of text here
end
Alternativement, s'il est vraiment délimité par des tabulations, vous pouvez utiliser la bibliothèque CSV :
File.open('foo.txt') do |f|
CSV.foreach(f, col_sep:"\t") do |csv_row|
# All parsed for you
end
end
IO.foreach("input.txt") do |line|
out.puts line
# You might be able to use split or something to get attributes
atts = line.split
end
Avez-vous essayé d'utiliser OpenURI
( http://Ruby-doc.org/stdlib-2.1.2/libdoc/open-uri/rdoc/OpenURI.html )? Vous devrez rendre vos fichiers accessibles depuis S3.
Ou essayez d'utiliser de aws-sdk
gem ( http://aws.Amazon.com/sdk-for-Ruby ).
Vous pouvez utiliser OpenURI pour lire des fichiers distants ou locaux.
En supposant que votre modèle possède une pièce jointe nommée file
:
# If object is stored in Amazon S3, access it through url
file_path = record.file.respond_to?(:s3_object) ? record.file.url : record.file.path
open(file_path) do |file|
file.each_line do |line|
# In your case, you can split items using tabs
line.split("\t").each do |item|
# Process item
end
end
end