Ruby TIPS

Ruby TIPS

ファイルから1文字ずつ読み込む(入力する)には?

2017年5月17日

Rubyでテキストファイルから文字列を読み込むための方法として、ファイルから1文字単位で文字を取得する方法と、ファイル内の全テキスト内容を先頭から1文字ずつループ処理する方法を説明する。

ローグ・インターナショナル 羽山 博
  • このエントリーをはてなブックマークに追加

 前回の「ファイルから文字列を読み込む(入力する)には?(基本編)」では、Rubyでテキストファイルから文字列を読み込むための基本的な方法を解説し、さらにファイル操作をブロックで記述する方法や、読み込み専用モードでファイルを開く方法、文字コードの基本的な取り扱い方を見た。

 今回および次回の「ファイルから1行ごと/段落ごと読み込む(入力する)には?」ではその続編として、さまざまな単位でファイルの内容を読み込むメソッドを見ていく。今回は1文字ずつ読み込む方法を見ていこう。

ファイル入出力の基本 − 入力編

ファイルから1文字ずつ読み込む ― getcメソッド、readcharメソッド

 1文字ずつの読み込みには、getcメソッドまたはreadcharメソッドを使う。この2つのメソッドの働きは、基本的には同じだが、ファイルの末尾に達したときにgetcメソッドがnilを返し、readcharメソッドがEOFErrorを発生させるという点だけが異なる。

 以下の例では、data001.txtファイルから、getcメソッドで3文字読み込んでpメソッドで表示する。ちなみに、リスト1.5のコードでreadcharを試したい場合は、単純に「getc」を「readchar」に置換するだけでよい。

sample005.rb
File.open("data001.txt", mode="rt"){|f|
  p f.getc  # 1文字目
  p f.getc  # 2文字目
  p f.getc  # 3文字目
}
リスト1.5 ファイルの先頭から3文字読み込んで表示するプログラム

テキストモードでファイルを開いているので、改行文字がLFCRCRLFのいずれであってもLFとして取り扱われる。

 実行結果は以下の通りである。

ターミナル
$ ruby sample005.rb
"青"
"龍"
"\n"
実行例1.5 1文字ずつ読み込んで3文字分表示する

ファイルに含まれる文字列が3文字より少ない場合、getcメソッドではnilが返されるので、読み込めなかった文字数だけnilが表示される。readcharメソッドでは、ファイルの末尾以降を読み込もうとした時点でEOFErrorエラーとなる。

全ての文字を1文字ずつ読み込む(ブロックを利用) ― each_charメソッド

 続いて、全ての文字を1文字ずつ読み込む方法を見てみよう。

 この場合、Fileクラスのeach_charメソッドを使うとよい。each_charメソッドは読み込んだ文字を1文字ずつブロックに渡してくれる。

sample006.rb
File.open("data001.txt", mode="rt"){|f|
  f.each_char{|c|
    p c
  }
}
リスト1.6 ファイルの先頭から1文字ずつ、全ての文字を読み込んで表示するプログラム

単純に1文字ずつ読み込み、その文字を表示する。この例では、読み込まれた文字はブロックパラメーターのcに渡される。

 実行例は以下の通り。

ターミナル
$ ruby sample006.rb
"青"
"龍"
"\n"
"朱"
"雀"
"\n"
"白"
"虎"
"\n"
"玄"
"武"
実行例1.6 全ての文字を読み込んで表示する

ファイルに含まれる文字が1文字ずつ表示された。文字をそのまま出力するなら、リスト1.6のpメソッドの代わりにprintメソッドを使えばよい。

 なお、文字単位でなくバイト単位で読み込む場合にはeach_byteメソッドを使い、コードポイント(1文字のコード)を読み込むにはeach_codepointメソッドを使う。

まとめ

 getcメソッドとreadcharメソッドは1文字読み込むのに使う。each_charメソッドは、1文字ずつ読み込み、ブロックパラメーターに文字を渡すので、ファイルから1文字ずつ全ての内容を読み込む場合などに使える。

処理対象:文字列の読み込み(入力) カテゴリ:ファイル入出力
API:IOクラス|Fileクラス|EOFErrorクラス カテゴリ:組み込みライブラリ
API:getcメソッド|readcharメソッド|each_charメソッド カテゴリ:IOクラス

※以下では、本稿の前後を合わせて5回分(第18回~第22回)のみ表示しています。
 連載の全タイトルを参照するには、[この記事の連載 INDEX]を参照してください。

18. 演算子を再定義するには?

Rubyではクラスの二項演算子や単項プラス/マイナス演算子を定義(もしくは再定義)できる。その方法を基礎から説明し、実用的な使い方の例を示す。

19. ファイルから文字列を読み込む(入力する)には?(基本編)

テキストファイルから文字列を読み込むための基礎を解説。ファイル操作をブロックで記述する方法や、ファイルを開く際に「テキスト読み出し専用モード」でアクセスしたり文字コードを指定したりする方法、BOM付きファイルを処理する方法を説明する。

20. 【現在、表示中】≫ ファイルから1文字ずつ読み込む(入力する)には?

Rubyでテキストファイルから文字列を読み込むための方法として、ファイルから1文字単位で文字を取得する方法と、ファイル内の全テキスト内容を先頭から1文字ずつループ処理する方法を説明する。

21. ファイルから1行/段落ごと読み込む(入力する)には?

Rubyでテキストファイルから文字列を読み込むための方法として、ファイル内の全テキスト内容を先頭から1行単位ずつもしくは1段落ずつループ処理する方法と、ファイルから読み込んだ全ての行を配列として返す方法を説明する。

22. ファイルに文字列を書き込む(出力する)には?

テキストファイルに文字列を書き込むための基本を解説。新規書き込みと追加の方法を確認した後、任意の位置から書き込む方法や読み書き両用モードでファイルを利用する方法を説明する。

サイトからのお知らせ

Twitterでつぶやこう!