Rubyでファイルを読み込み処理を作るには、ファイルポインタの仕組みを理解してなければなりません。そしてRubyのFileオブジェクトがファイルポインタとして働き、さらにそのメソッドをファイルの読み込みに利用します。
さらに読み込みしたいファイルのフォーマットに合わせて便利がライブラリが用意されています。ぜひ、そのようなライブラリをうまく利用しましょう。今回は、Rubyのファイル読み込みプログラムの作り方を紹介します。
Rubyでファイルを読み込む
Rubyでは、標準で組み込まれているFileクラスを利用することで、ファイル読み込み処理を作ったりファイルに書き込む処理を作ることが可能です。まずはRubyでファイル読み込み処理の基本について解説します。
open処理とread処理が必要
プログラムの中でファイルを読み込む場合、まず対象のファイルを開く処理を実施し、続いてそのファイルの内容を読み込みます。
なおFileクラスにはファイルにアクセスするための多くのメソッドが用意されていますが、ファイルを開く処理がopenメソッドで、この処理によりファイルポインタにあたるオブジェクトが作られす。そしてファイルを読み込みする処理がopenメソッドで、先ほどのオブジェクトでreadメソッドなどを利用してファイルを読み込みます。
このようにファイルを読み込みには次の2つの処理が必要です。
- Fileクラスのopenメソッドでファイルにアクセスするためのファイルポインタを作る。
- ファイルポインタのreadメソッドなどを利用して、ファイルからデータを読み込む。
ファイルポインタを使うには
先ほど、まずopenメソッドでファイルポインタに相当するオブジェクトを作成するを説明しましたが、プログラムからファイルにアクセスするにはファイルポインタを理解しなければなりません。
ファイルポインタとは、アクセスしたファイルのデータが格納されたアドレスを示すオブジェクトです。例えばopenメソッドで新規にファイルポインタが作られたら、そのファイルの先頭のアドレスを指しています。
そしてファイルからデータを読み込みするとそのアドレスに読み込んだデータのサイズに応じて加算されます。またファイルポインタを操作すれば、ファイルの先頭ではなく末尾からアクセスしたり、ファイルの途中からアクセスするプログラム作成も可能です。
ファイルポインタを操作するには
Rubyではファイルポインタもオブジェクトで、openメソッドで作られます。そしてopenメソッドのモードにより、ファイル先頭アドレスに設定したりファイルの末尾に設定することが可能です。
そしてopenメソッドで作られたオブジェクトのメソッドを利用してファイルを一括して読み込んだり、1行単位などで読み込めます。
またseekメソッドを使用すれば、ファイルポインタを指定したアドレスに移動させることが可能です。この機能を使ってファイル内の特定のデータのみ読み込み、処理に利用するプログラムも作れます。
Rubyのファイル読み込み方法
プログラムでファイルを読み込みしたらそれで終わりではありません。読み込んだデータから必要は情報を取り出して処理を利用します。そのためでRubyのプログラムからファイルを読み込む処理を作る場合、読み込んだデータからどうやって情報を取り出すかが重要です。
次からRubyのファイル読み込み方法について紹介します。
一括で読み込み処理する方法
もし読み込みするファイルが比較的小さい場合はファイルを一括して文字列として読み込み、その文字列を解析して利用するデータを抽出します。
例えばファイルに書かれた内容をそのままWebアプリケーションで表示する場合、一括して文字列として読み込み、そのまま表示するケースで利用可能です。
一括で読み込みする例
f = File.open("message.txt", "r") message = f.read f.close puts message
1行単位で読み込む方法
設定ファイルなど、テキストファイルをRubyのプログラムで読み込んで利用する場合、一旦行単位で読み込み、そこから必要なデータを取り出す方法をよく利用します。
このように1行単位で読み込む際に使うメソッドがeach_lineです。each_lineメソッドではブロックを使用するので、ブロック内で文字列を解析し、抽出した情報を配列やハッシュに格納しておけばプログラム内で利用できます。
1行単位で読み込み、読み込んだ文字列を配列に格納する例
lines = [] File.open("sample.txt", "r") do |f| f.each_line do |l| lines.push(l) end end p lines
1行単位で配列に読み込む別の方法
先ほどeach_lineメソッドを使った1行単位でファイルを読み込む方法を紹介しましたが、Fileクラスのforeachメソッドでも1行単位で読み込むことも可能です。
ただし、先ほどのeach_lineメソッドやforeachメソッドを使うと改行コードを含む文字列として読み込んでしまいます。改行コードが不要な場合は対策が必要なので注意してください。
foreachメソッドを使って1行単位で読み込む例
lines = [] File.foreach("sample.txt") do |l| s = l.chomp lines.push(s) end p lines
上の例は、foreachメソッドで読み込んだ1行分の文字列に対して、chompを適用して改行コードを削除して配列に取り組んでいます。
特定フォーマットのファイル読み込み方法
Webアプリケーションでは、特定のフォーマットに従ったファイルがよく読み込みされます。そしてRubyにはそういったよく使われるフォーマットを読み込み用メソッドが用意されているので、ぜひ、活用してください。次から代表的なフォーマットの読み込み用メソッドを紹介します。
CSVファイルの読み込み方法
CSVファイルのCSVとは「Comma Separated Value」の略で、そのまま日本語にすると「コンマで区切った値」という意味です。
このCSVファイルは、テキストで書かれた値を「,(コンマ)」で区切っただけのシンプルなフォーマットで、メーカーの違う表計算ソフト間でデータをやり取りしたり、表計算ソフトのデータをWebアプリケーションに取り込むケースなどで使わます。
RubyでCSVファイルを扱うためのライブラリがCSVクラスです。なおこのCSVクラスにはCSVファイル読み込みメソッドが複数ありますが、その中のforeachメソッドを使った例が次のとおりです。
require "csv" arr = [] CSV.foreach("data.csv") do |row| arr.push(row) end p arr
JSONファイルの読み込み方法
JSONファイルのJSONとは、「JavaScript Object Notation」の略で「JavaScriptのオブジェクト表記」という意味です。JavaScriptのオブジェクトをテキスト形式で記述できるフォーマットとして、Webブラウザの非同期通信などに使われることが多く、Webアプリケーションでもよく使われます。
そしてRubyにはJSONクラスが用意されているので、JSONファイルを利用する場合はこれを利用してください。なお、JSONクラスを利用する場合、ファイルポインタを使用します。Fileクラスを合わせてJSONファイル読み込みする例を次に紹介します。
require "json" arr = [] File.open("data.json") do |json| hash = JSON.load(json) arr.push(hash) end p arr
YAMLファイルの読み込み方法
YAMLファイルとは、構造化データやオブジェクトをテキストで簡潔に記述できる新しいフォーマット形式です。スペースのみのインデントで階層構造を表現するシンプルさが特徴で、Ruby on Railsの設定ファイルにも使われています。ぜひ、Webアプリケーションでも利用してください。
RubyにはYAMLクラスが用意されているので、YAMLファイルの読み込みにはこれを利用してください。次にYAMLクラスを利用した例を紹介します。
require 'yaml' arr = [] File.open("data.yml") do |yml| arr = YAML.load(yml) end p arr
まとめ
これまで紹介したようにファイルの読み込みにはファイルポインタを利用し、RubyではFileクラスのオブジェクトがこれにあたります。Rubyではこのオブジェクトを利用して一括で読み込む方法や1行毎に読む方法などのプログラムを作れます。
さらにRubyにはCSVやJSONなど、Webアプリケーションでよく使われるフォーマットに対応したクラスが用意されています。そのようなファイルの読み込み処理に利用してください。