Rubyのforeachでシンプルにファイルを読み込む方法を解説
  • facebookページ
  • twitterページ
  • 2021.02.19

    Rubyのforeachでシンプルにファイルを読み込む方法を解説

    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行毎に表示する例

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

    foreachメソッドのオプション

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

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

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

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

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

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

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

    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メソッドの例

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

    each_lineとforeachの違い

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

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

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

    まとめ

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

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



    優良フリーランス案件多数掲載中!
    フリーランスエンジニアの案件をお探しなら
    ポテパンフリーランス

    この記事をシェア

    • Facebookシェア
    • Twitterシェア
    • Hatenaシェア
    • Lineシェア
    pickup









    ABOUT US

    ポテパンはエンジニアと企業の最適なマッチングを追求する企業です。

    READ MORE