web-dev-qa-db-fra.com

Comment lire ligne par ligne un fichier texte en Ruby (l'héberger sur s3)?

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?

30
Timothy T.
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?

43
fl00r

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
21
Phrogz
  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
4
Upgradingdave

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 ).

1
guapolo

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
1
AlexGuti