如何逐行读取ruby中的文本文件(在s3上托管)?

时间:2011-04-27 18:57:55

标签: ruby-on-rails ruby text import heroku

我知道我之前已经完成了这项工作并找到了一组简单的代码,但我记不住或找不到它了:(。

我有一个我要导入Rails 3应用程序的记录文本文件。

每一行代表一条记录。可能它可能是属性的制表符分隔,但只有一个值也可以。

我该怎么做?

5 个答案:

答案 0 :(得分:43)

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

相关主题

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

答案 1 :(得分:20)

您想要IO.foreach

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

或者,如果它确实是制表符分隔的,您可能想要使用CSV库:

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

答案 2 :(得分: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

答案 3 :(得分:1)

您是否尝试过使用OpenURIhttp://ruby-doc.org/stdlib-2.1.2/libdoc/open-uri/rdoc/OpenURI.html)?您必须从S3访问您的文件。

或尝试使用de aws-sdk gem(http://aws.amazon.com/sdk-for-ruby)。

答案 4 :(得分:1)

您可以使用OpenURI来读取远程或本地文件。

假设您的模型有一个名为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