- ベストアンサー
Rubyでファイルの特定行を取り出す方法
- Rubyのプログラムで特定行の文字列を取り出したい場合、ファイルを開いてreadlinesメソッドを使うことで実現できます。
- ただし、特定行を複数取り出す場合、ファイルを複数回開く必要があります。
- 行番号が連続している場合は、一度ファイルを開いた後に複数回のreadlinesメソッド呼び出しで対応できます。
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
No3です。 >Rubyのみ初心者です. よかった。 >>確認2:readlinesというメソッドはどういう機能を持ったメソッドだと思っていますか? >ファイルの内容が一行ずつ入った配列だと思ってます ファイルを行の配列のようにアクセスできるメソッドと思っているのなら間違いです。 ファイルから全データを読み込んで、それを配列の形で返すメソッドです。したがって、呼び出したことで、該当ファイルのファイルポインタ(ファイル中で次に読み取る文字位置)は末尾のEOFの所に行ってしまいます。二回目の呼び出しで、EOFに達したファイルを再度読むことになるので空が返ります。具体的には配列なので [] が返ります。 他の方がお書きのように、呼び出し結果の配列オブジェクトを保持しておいて、以降はそれをつかうといいです。
その他の回答 (3)
- notnot
- ベストアンサー率47% (4900/10358)
確認1:Rubyの初心者とお書きですが、他の言語でのこういうプログラミング経験があって、Rubyのみ初心者なのか、あるいは、プログラミングそのものの初心者なのかによって、説明のポイントが異なりますが、どちらでしょうか? 後者だとすると、かなり説明が大変です。 確認2:readlinesというメソッドはどういう機能を持ったメソッドだと思っていますか?
補足
>確認1:Rubyの初心者とお書きですが、他の言語でのこういうプログラミング経験があって、Rubyのみ初心者なのか、あるいは、プログラミングそのものの初心者なのかによって、説明のポイントが異なりますが、どちらでしょうか? Rubyのみ初心者です. >確認2:readlinesというメソッドはどういう機能を持ったメソッドだと思っていますか? ファイルの内容が一行ずつ入った配列だと思ってます.
- sakusaker7
- ベストアンサー率62% (800/1280)
content.readlines でファイルの内容が丸ごと入った配列になっているので、 普通の配列で二番目と三番目を取るにはどうすればいいかと考えてみてはどうでしょう? あ、そう考えちゃっているから File::open("foo") {|content| puts content.readlines[1] puts content.readlines[2] } としちゃったんですね。 File::open("foo") {|content| v = content.readlines puts v[1] puts v[2] } と同じだろうと考えちゃったのかもしれませんが違います。 なぜ違うのかはここでは説明しませんが、考えて分からないようなら補足に書いてください。 二つ目のように一時変数を作りたくないというのであれば#1の方の回答の他にも こう言ったものが考えられます。 File.open('foo').each_with_index { |line, index| puts line if index == 1 || index == 2 } puts((File.open('foo').readlines)[1..2]) open("foo") {|file| puts file.readlines[1..2] } open("foo") {|file| puts file.readlines.values_at(1, 2) } お好みでどうぞ。
補足
遅くなって済みません, わざわざ例を書いてくださってありがとうございます. >なぜ違うのかはここでは説明しませんが、考えて分からないようなら補足に書いてください。 すみません,まったく違いがわからないです. 書いて下さった例でも,結局readlines[1]という風にアクセスしてるんじゃないの?と疑問に思ってしまいます.
- osamuy
- ベストアンサー率42% (1231/2878)
案1) open( 'foo' ) do |fh| a = fh.readlines; p a[1]; p a[2]; end 案2) open( 'foo' ) do |fh| lino = 0; while fh.gets lino += 1; p $_ if lino == 2 || lino == 3; break if lino >= 3; end end
お礼
おお! なるほど,どうりで2回目はnilになるわけですね ありがとうございました.