
こちらのサイトを参考にさせていただきました.
http://www.namaraii.com/rubytips/?%A5%D5%A5%A1%A …
やりたいことはファイルにアクセスして2行目,3行目の文字列をとってくることです.
===foo===
hoge
hige
foobar
File::open("foo") {|content|
puts content.readlines[1]
puts content.readlines[2]
}
このようなプログラムだと,
hige
nil
となります.ですが,以下のように分割するとうまくいきます.
File::open("foo") {|content|
puts content.readlines[1]
}
File::open("foo") {|content|
puts content.readlines[2]
}
hige
foobar
できればopenは一回だけで済ませたいのですが可能でしょうか?
Ruby初心者なのでくだらない質問かもしれませんが,ご教授ねがいます.
No.4ベストアンサー
- 回答日時:
No3です。
>Rubyのみ初心者です.
よかった。
>>確認2:readlinesというメソッドはどういう機能を持ったメソッドだと思っていますか?
>ファイルの内容が一行ずつ入った配列だと思ってます
ファイルを行の配列のようにアクセスできるメソッドと思っているのなら間違いです。
ファイルから全データを読み込んで、それを配列の形で返すメソッドです。したがって、呼び出したことで、該当ファイルのファイルポインタ(ファイル中で次に読み取る文字位置)は末尾のEOFの所に行ってしまいます。二回目の呼び出しで、EOFに達したファイルを再度読むことになるので空が返ります。具体的には配列なので [] が返ります。
他の方がお書きのように、呼び出し結果の配列オブジェクトを保持しておいて、以降はそれをつかうといいです。
No.3
- 回答日時:
確認1:Rubyの初心者とお書きですが、他の言語でのこういうプログラミング経験があって、Rubyのみ初心者なのか、あるいは、プログラミングそのものの初心者なのかによって、説明のポイントが異なりますが、どちらでしょうか?
後者だとすると、かなり説明が大変です。
確認2:readlinesというメソッドはどういう機能を持ったメソッドだと思っていますか?
この回答への補足
>確認1:Rubyの初心者とお書きですが、他の言語でのこういうプログラミング経験があって、Rubyのみ初心者なのか、あるいは、プログラミングそのものの初心者なのかによって、説明のポイントが異なりますが、どちらでしょうか?
Rubyのみ初心者です.
>確認2:readlinesというメソッドはどういう機能を持ったメソッドだと思っていますか?
ファイルの内容が一行ずつ入った配列だと思ってます.
No.2
- 回答日時:
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]という風にアクセスしてるんじゃないの?と疑問に思ってしまいます.
No.1
- 回答日時:
案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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語の問題の説明、各所ごとに 5 2023/07/26 11:03
- CGI htmlからパラメータで、cgiに渡したい。 1 2023/02/06 16:15
- HTML・CSS アコーディオンメニューが思うように動作しません。 1 2023/08/20 16:48
- JavaScript セレクトボックスを2つ設けて選択して初めてメッセを表示 1 2022/07/27 12:15
- JavaScript switch文のswitch(n)の部分を複数の値にするか、if文に変えてほしいです。 1 2022/07/27 17:18
- PHP 画像ファイルの名前をそのままURLにする 3 2022/10/16 11:18
- JavaScript jQueryでのドラッグアンドドロップについて 1 2022/07/07 21:04
- PHP style.cssのjQuery条件付きcssが機能しない 4 2022/07/17 18:27
- 建築士 公共建築工事共通費積算基準(令和5年改定)の共通仮設費率について 2 2023/04/05 10:34
- HTML・CSS cssが効かなくて困ってます 1 2023/01/01 23:57
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
エクセルへのデータの貼付時に...
-
○桁にある数値を取得する VB.N...
-
複数ディレクトリの監視(VB.NET...
-
配列の値を置換するにはどうす...
-
VBAで配列に文字列が入らない?
-
VB.NET 2次元配列
-
VBAのWorksheetFunctionの引数...
-
数値を浮動小数点32bitHEXコー...
-
excelの、ある数式内の{}の意...
-
ファイルの特定行を取り出したい.
-
vbsでテキストファイル内の文字...
-
フォームを開くときに、コンボ...
-
VBAでダブルコーテーション入り...
-
java final
-
CGIのPerlの変数をJavaScrip...
-
Excel-vba 文字列と変数を...
-
C#で動的にコントロールを取得...
-
URLが開いた後に処理したい
-
Variant型で宣言してるのにEmpt...
-
数字の位ごとの値を表示するプ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
excelの、ある数式内の{}の意...
-
配列の値を置換するにはどうす...
-
VBAのWorksheetFunctionの引数...
-
COLUMN(1:1)の意味を教え...
-
vbsでテキストファイル内の文字...
-
エクセルへのデータの貼付時に...
-
数値を浮動小数点32bitHEXコー...
-
VBAで配列に文字列が入らない?
-
複数ディレクトリの監視(VB.NET...
-
VB6で配列を文字列に変換する方...
-
VB 配列の内容をファイルに書...
-
VBSで特定の文字列が含まれる場...
-
エクセル、この関数の意味は?
-
○桁にある数値を取得する VB.N...
-
VB.NET 2次元配列
-
【エクセル】 関数による電子...
-
初心者プログラミング
-
VB.NET 2つの配列を連動して並...
-
in_addrからchar型の文字列の変換
-
RichTextBoxの改行を認知してく...
おすすめ情報