受講料が最大70%OFF 受講料が最大70%OFF

Rubyのforeachは、配列の繰り返しに使うメソッドではなく、テキストファイルを1行つづ読み込むためのメソッドです。なお、Rubyにはファイルを扱うメソッドが幾つもあり、foreachと同じ処理を別のメソッドでも書けます。しかし、シンプルに書けるforeachを使えないのはもったいない。

今回は、Rubyでテキストファイルを読み込むためのメソッドforeachについて詳しく解説します。

Rubyでテキストファイルを読み込む方法

Rubyの特徴は、文法が分かりやすくシンプルで見やすいプログラムが書ける点です。そのため、Webシステムの開発はもちろん、サーバー管理などいろいろな分野で利用されています。

なお、そのような用途ではテキストを扱うケースが多く、Rubyのプログラムでテキストファイルを扱うことがよくあります。今回紹介するforeachメソッドも、そうしたテキストファイルを扱うRubyの機能の1つです。

次からRubyでテキストファイルを扱う方法について説明します。

Rubyでファイルを扱うには

Rubyでファイルを扱うには、Fileクラスのメソッドを利用してます。今回紹介するforeachは、Fileクラスのメソッドです。そして、テキストファイルを1行ずつ読み込む際に利用します。

なお、Rubyで扱う全ての変数やメソッドは、何等かのクラスに属しており、ファイルアクセスに利用するメソッドや変数が属するのはFileクラスです。ただし、FileクラスはRubyの標準で組み込まれており、特にライブラリを組み込む必要なしに利用できます。

RubyのFileクラスとは

今回紹介するforeachはFileクラスのメソッドの1つです。しかし、RubyのFileクラスのマニュアルで今回紹介するforeachを探しても見つかりません。なぜならforeachはIOクラスで定義されたメソッドです。FileクラスはIOクラスを継承しているので、IOクラスに定義されたメソッドも利用できます。

なお、RubyのFileクラスでは、C言語のフィルポインタのようにFileオブジェクトを使ってファイルにアクセスするメソッドと、直接ファイル名を指定できるメソッドとがあります。そして、今回紹介するforeachメソッドは直接ファイル名を指定するメソッドです。

一方、バイナリファイルなど読み込む場合は細かい制御が必要です。そのような場合は、ファイルオブジェクトを作成し、それに対して制御するメソッドなどが使われます。

テキストファイルの注意点

半角のアルファベットのみで書かれたテキストファイルであれば、Rubyのプログラムの読み書きは問題ありません。しかし、日本語のテキストファイルは、ひらがなや感じはUTF-8などの文字コードによって書かれています。そのため、文字コードへの注意が必要です。

日本語のテキストファイルをRubyのプログラムで処理する場合、デフォルトで設定されている文字コードが使われます。なお、Rubyではプログラム内で利用する文字コードを設定できるので、もしデフォルトの文字コードがファイルと合わない場合は、読み込み時の文字コードを指定できます。

foreachメソッドの基本

Rubyにはテキストファイルを読み込む方法が幾つかありますが、シンプルに書けるうえ1行ずつ処理するのに向いているのがforeachメソッドです。

Ruby以外のプログラム言語のforeachは、配列の要素を使った繰り返し処理に使われますが、Rubyのその機能はeachです。Rubyの繰り返し処理ではforeachを使わないので注意してください。

次からforeachメソッドの基本について紹介します。

foreachメソッドの文法

foreachメソッドは、引数で指定されたパスのテキストファイルにアクセスし、続くブロック内に指定した1行分を格納した変数を使って、行数分だけ繰り返す処理が書けるメソッドです。

なお、foreachメソッドはIOクラスに属するメソッドですが、File1クラスはIOメソッドを継承しているので、Fileクラスのメソッドとしても利用できます。

foreachメソッドの基本的な文法は次のとおりです。

File.foreach( テキストファイルのパス名 ) { |1行分を格納する変数|

1行分を繰り返し処理する内容

}

テキストファイルを読み込んで1行毎に表示する例

File.foreach("list.txt") { |line|
  p line
}

この例では、テキストファイル「list.txt」を読み込み、その1行分を変数lineに取り込んで、ブロック内でそれを表示します。なお、foreachは元々IOクラスのメソッドなのでFile.foreachではなくIO.foreachと書くことも可能です。

foreachメソッドのオプション

先ほどforeachの基本的な文法を紹介しましたが、foreachはテキストファイルのパスの他に次の2つのオプションも指定できます。

rs=区切り文字
chomp:tureまたはfalse

通常foreachはテキストファイルを改行文字で区切った文字列を1行分として扱います。しかし、rs=オプションに区切り文字を指定した場合、指定した文字で区切った文字列を1行分として扱います。

区切り文字として「,」を指定した例

File.foreach("list.txt", rs="," ) { |line|
  p line
}

また、通常foreachを使い改行文字で区切った1行分を取り出すと、そこにはまだ改行文字が含まれています。しかし、chomp:trueを指定することで、改行文字を除いた1行分の文字列を取り出すことが可能です。

改行コードを含めて1行を切り出す例

File.foreach("list.txt", chomp=true ) { |line|
  p line
}

必要に応じてこれらのオプションも活用してください。

foreachメソッドと似ているメソッド

Rubyには、今回紹介しているforeachメソッドと同じようなメソッドが他にもあります。次からそのメソッドの使い方について、foreachメソッドと比較しながら紹介します。

Fileクラスのeach_lineメソッド

RubyのFileクラスにはファイルを操作するためのメソッドがいろいろ定義されていますが、その中でforeachメソッドと同じようなメソッドがeach_lineです。

each_lineメソッドは、openメソッドで作成するFileオブジェクトに対して実行するメソッドで、foreachメソッドと同じく1行ずつ文字列を読み込み、それを続くブロック内にその文字列の処理を記述します。さらにforeachメソッドと同じくオプションで区切り文字を指定したり、改行文字の削除の有無を指定可能です。

Fileクラスのeach_lineメソッドの文法

(Fileオブジェクト).each_line(オプション) ブロック

each_lineの使用例

次にeach_lineメソッドを使ったテキストファイルを読み込み、そのまま表示する例を紹介します。

Fileクラスのeach_lineメソッドの例

fs = open("list.txt")
fs.each_line { |line|
  p line
}

この処理と同じ処理をforeachメソッドで書いた例が次のとおりです。

File.foreach("list.txt") { |line|
  p line
}

each_lineとforeachの違い

each_lineとforeachは、Fileオブジェクトを利用するかしないかの違いくらいで、ほぼ同じように思えるかもしれません。しかし、each_lineメソッドでは、区切り文字ではなく、文字数で区切った文字列を作ることも可能です。そのため改行コードが含まれていない文字列を処理する場合は、each_lineメソッドの利用も検討してください。

each_lineを使い文字数で区切った文字列を処理する例

fs = open("longtext.txt")
fs.each_line(80) { |line|
  p line
}

この例は、改行文字を含まないテキストファイルから80文字の文字列を切り出し、続くブロック内でそれを表示します。

まとめ

例えばJavaやC++では、配列を使ったforeachは繰り返しで使われますが、Rubyにおける同じ処理のメソッドはeachです。そしてRubyのforeachはテキストファイルを1行ずつ読み込むためのメソッドです。間違えないように注意してください。

なお、Rubyのforeachと同じ処理は他のメソッドでも作れます。それぞれの使い方をマスターし、使う状況に応じて使い分けられるようになりましょう。

エンジニアになりたい人に選ばれるプログラミングスクール「ポテパンキャンプ 」

ポテパンキャンプは卒業生の多くがWebエンジニアとして活躍している実践型プログラミングスクールです。 1000名以上が受講しており、その多くが上場企業、ベンチャー企業のWebエンジニアとして活躍しています。

基礎的な学習だけで満足せず、実際にプログラミングを覚えて実践で使えるレベルまで学習したいという方に人気です。 プログラミングを学習し実践で使うには様々な要素が必要です。

それがマルっと詰まっているポテパンキャンプでプログラミングを学習してみませんか?

卒業生の多くがWebエンジニアとして活躍

卒業生の多くがWeb企業で活躍しております。
実践的なカリキュラムをこなしているからこそ現場でも戦力となっております。
活躍する卒業生のインタビューもございますので是非御覧ください。

経験豊富なエンジニア陣が直接指導

実践的なカリキュラムと経験豊富なエンジニアが直接指導にあたります。
有名企業のエンジニアも多数在籍し品質高いWebアプリケーションを作れるようサポートします。

満足度高くコスパの高いプログラミングスクール「ポテパンキャンプ」

運営する株式会社ポテパンは10,000人以上のエンジニアのキャリアサポートを行ってきております。
そのノウハウを活かして実践的なカリキュラムを随時アップデートしております。

代表の宮崎もプログラミングを覚えサイトを作りポテパンを創業しました。
本気でプログラミングを身につけたいという方にコスパ良く受講していただきたいと思っておりますので、気になる方はぜひスクール詳細をのぞいてくださいませ。