web-dev-qa-db-ja.com

Ruby(s3でホスト))のテキストファイルを1行ずつ読み取るにはどうすればよいですか?

私はこれを以前にやったことがあり、簡単なコードのセットを見つけたことを知っていますが、それを思い出すことも見つけることもできません:(。

Rails 3アプリケーションにインポートするレコードのテキストファイルがあります。

各行はレコードを表します。属性ごとにタブで区切られている可能性がありますが、単一の値でも問題ありません。

どうすればいいですか?

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

関連トピック

Rubyでファイルを読み取るための一般的な方法は何ですか?

43
fl00r

欲しい 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
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

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 )を使用してみてください。

1
guapolo

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