Rubyについて質問です。
ファイルを一行ずつ読み込み、特定の文字列を検索したいのですが、
「最初から最後の行まで検索」し終えたら無限ループ終了とするプログラムをどう書けばいいのかわかりません。
どなたか教えていただけるとうれしいです。
よろしくお願いします。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
一行の読み込みには何を使っていますか?gets
ですか?readline
ですか?どちらを使っているのかで対応が異なります。
###IO#getsの場合
全ての行を読み込み、それ以上読み込む行がない場合、gets
はnil
を返します。ですので、nil
が返ってきたら、終了できるようにします。この性質を利用してループ自体をこのように書く場合が多いです。
Ruby
1# 末端になれば、getsの取得でnilが返ってくるため、ループが終わる。 2while line = file_input.gets 3 # line には行全体が入っており、必要な行に対する処理を行う。 4end
###IO#redlineの場合
全ての行を読み込み、それ以上読み込む行がない場合、readline
はEOFError
例外を発生させます。例外をresuceするようにしていなければ、強制的にループは止まります。その後もrescueしなければ、プログラム全体が止まってしまうので、適切な例外処理が必要になります。例外処理は重いと言うこともあり、あまり一般的な方法ではありません。
Ruby
1begin 2 loop do 3 # 末端になれば、例外発生が発生し、ループを抜ける。 4 line = file_input.readline 5 # line には行全体が入っており、必要な行に対する処理を行う。 6 end 7rescue EOFError 8 # キャッチしないとプログラム全体がエラーで止まる。 9end
###その他の方法
一行を読み込む方法はgets
やreadline
だけではありません。IO#readlines(複数形)で全ての行を配列として読み込む、IO#eachで各行を順番に処理をすると言う方法があります。
Ruby
1# 全ての行を一度に読み込み、各行が入った配列にする。 2# ファイルのサイズが大きいと大量にメモリを消費するため、注意が必要。 3all_lines = file_input.readlines
Ruby
1# 末端になれば、eachでのループは終了する。 2file_input.each do |line| 3 # line には行全体が入っており、必要な行に対する処理を行う。 4end
Fileの親であるIOはEnumerableをmixinしていますので、each意外にもmapやfind_allなども使えます。特定の文字列を探したいのであればEnumerable#grepを使うと良いかもしれません。
Ruby
1# /hoge/ にマッチする行のみ抜き出して、listに入れる。 2list = file_input.grep(/hoge/)
投稿2016/12/30 09:14
総合スコア21733
0
ベストアンサー
ファイルを最初から最後まで読み込む、かつそれほど大きなファイルではない場合は
Ruby
1File.read("ファイル名")
で一度にすべて読み込んでも大丈夫だと思います。
あとは読み込んだファイルを対象に
.include?("検索したい文字列")
で検索。
これなら無限ループにならないしループを抜ける処理もしなくてよいです。
特定の行に、ある文字列が含まれているかを調べる場合は
Ruby
1#encoding : utf-8 2word = "特定の文字列" 3f = File.read("ファイル名").encode("UTF-8").split("\n") 4line = 1 5f.each do |element| 6 if element =~ /#{word}/ then 7 puts "〇#{line}行目に含まれていました。" 8 else 9 puts "\t#{line}行目には含まれていませんでした。" 10 end 11 line += 1 12end
こんな感じで。
投稿2017/01/05 03:36
編集2017/01/05 05:22退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
参考情報
-
【Ruby】よく使うFileクラスを使ったファイル読み込み処理 http://qiita.com/mogulla3/items/fbc2a46478872bebbc47
-
逆引きRuby ファイルアクセス http://www.namaraii.com/rubytips/?%E3%83%95%E3%82%A1%E3%82%A4%E3%83%AB%E3%82%A2%E3%82%AF%E3%82%BB%E3%82%B9
-
ファイル内の正規表現でマッチした行を表示 http://qiita.com/ntakuya/items/9d2c6d292a87f6bd2aee
-
rubyでgrep http://akio0911.net/archives/2516
投稿2016/12/31 16:05
総合スコア22322
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。