2011-04-27 24 views
27

Sé que he hecho esto antes y encontré un simple conjunto de código, pero no puedo recordar o encontrar :(.¿Cómo leo línea por línea un archivo de texto en ruby ​​(alojado en s3)?

Tengo un archivo de texto de los registros que desea importar en mi aplicación Rails 3.

Cada línea representa un registro potencialmente puede ser delimitado por tabuladores para los atributos, pero estoy bien con sólo un único valor, así

? ¿Cómo hago esto

Respuesta

17

¿quieres IO.foreach:..?

IO.foreach('foo.txt') do |line| 
    # process the line of text here 
end 

Alternativamente, si realmente es delimitado por tabuladores, es posible que desee utilizar el CSV biblioteca:

File.open('foo.txt') do |f| 
    CSV.foreach(f, col_sep:"\t") do |csv_row| 
    # All parsed for you 
    end 
end 
+0

¿El IO.foreach proporcionar un iterador? –

+1

En realidad, eso se responde aquí: https://stackoverflow.com/a/16732186/3114742 –

4
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 
40
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 

Tema relacionado

What are all the common ways to read a file in Ruby?

+3

Esto no resuelve el problema del archivo que está en s3 – Patm

+0

@Patm, oh veo :) Pero en este momento los tres contestadores estaban respondiendo que el tema no era sobre S3. Simplemente fue '¿Cómo leo línea por línea un archivo de texto en ruby? – fl00r

+0

¿Hay alguna manera de hacerlo cuando el archivo se encuentra en s3? – Angela

1

Puede usar OpenURI para leer archivos locales o remotos.

Suponiendo que el modelo tiene un archivo adjunto denominado 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 
Cuestiones relacionadas