質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.51%
Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

Q&A

解決済

4回答

2307閲覧

無限ループの終了について

退会済みユーザー

退会済みユーザー

総合スコア0

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

0グッド

0クリップ

投稿2016/12/30 08:40

Rubyについて質問です。

ファイルを一行ずつ読み込み、特定の文字列を検索したいのですが、
「最初から最後の行まで検索」し終えたら無限ループ終了とするプログラムをどう書けばいいのかわかりません。

どなたか教えていただけるとうれしいです。
よろしくお願いします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答4

0

一行の読み込みには何を使っていますか?getsですか?readlineですか?どちらを使っているのかで対応が異なります。

###IO#getsの場合

全ての行を読み込み、それ以上読み込む行がない場合、getsnilを返します。ですので、nilが返ってきたら、終了できるようにします。この性質を利用してループ自体をこのように書く場合が多いです。

Ruby

1# 末端になれば、getsの取得でnilが返ってくるため、ループが終わる。 2while line = file_input.gets 3 # line には行全体が入っており、必要な行に対する処理を行う。 4end

###IO#redlineの場合

全ての行を読み込み、それ以上読み込む行がない場合、readlineEOFError例外を発生させます。例外をresuceするようにしていなければ、強制的にループは止まります。その後もrescueしなければ、プログラム全体が止まってしまうので、適切な例外処理が必要になります。例外処理は重いと言うこともあり、あまり一般的な方法ではありません。

Ruby

1begin 2 loop do 3 # 末端になれば、例外発生が発生し、ループを抜ける。 4 line = file_input.readline 5 # line には行全体が入っており、必要な行に対する処理を行う。 6 end 7rescue EOFError 8 # キャッチしないとプログラム全体がエラーで止まる。 9end

###その他の方法

一行を読み込む方法はgetsreadlineだけではありません。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

raccy

総合スコア21733

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

each_line
というメソッドが便利だと思います

sample

File.open('ファイル名') do |file| file.each_line do |line| # puts line # ここに処理を書く end end

投稿2016/12/30 09:15

satoshih

総合スコア797

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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

参考情報

投稿2016/12/31 16:05

katoy

総合スコア22322

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.51%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問