File の読み書き

ここには、Ruby での File の扱いについて、いくつかメモしておく。

ファイルを開いて、その内容を読み込んだり、書き込んだりするには、File.open もしくは単に、open を使う。

option を指定して、開き方を決める。option に何も指定しないと読み込みモードになる。

あと、ファイルは、開けたら close で閉じる。

File.open(file name,option)

open(file name,option)

r: 既存のファイルを読み込み専用で

r+: 既存のファイルを読み書き両用で

w: 新規のファイルを書き込み専用で

w+: 新規のファイルを読み書き両用で

a: 新規/既存のファイルを追加書き込み専用で

a+: 新規/既存のファイルを追加書き込み/読み込み両用で

使い方は、ファイルオブジェクトを作って、中身にアクセスした後閉じるか、ブロックで使う。

次の例は、スクリプトがあるディレクトリの text.txt というファイルを開く方法。

file = File.open("text.txt","r")

処理

file.close

にするか

File.open("text.txt","r") do |file|

処理

end

のようにブロックにする。

ここで、ファイルを開いている間に、read で読み込んだり、write で書き込んだりする。上の例での処理に入れる場合、

file.read

で、ファイルの内容をすべて読み込む。read(byte) で、先頭から byte バイトの文字を読み込む。

content = file.read

のように、content という String オブジェクトを作ってそれを処理していく。

これ以外にも、each を使って改行コード (\n) ごとの固まりで処理していくこともできる。(gets も使える)

file.each do |paragraph|

処理

end

ただ単に中身のテキストを表示させるだけなら、次のように書ける。

File.open("text.txt","r") do |file|

file.each do |paragraph|

print paragraph

end

end

もしくは

file = File.open("text.txt","r")

file.each do |paragraph|

print paragraph

end

file.close

面倒くさければ、まとめて次のようにも書ける。

File.open("text.txt").each do |paragraph|

print paragraph

end

ファイルを書き込むには、

file.write("This is the text.")

なので、これを処理のところに入れる。

File.open("text.txt","w") do |file|

file.write("This is the text.")

end

これで、ファイルの内容の基本的な読み書きはできたはず。

CSV ファイルの読み書き

String オブジェクトで、CSV を作ってもいいが、Ruby には便利な CSV クラスのライブラリがあるので、

require 'csv'

で読み込んで使う。

CSV.open(path,mode[,separator][,EOL char]) を使って csv ファイルの読み書きができる。path はそのままファイルのパス、mode は r が読み込み、w が書き込み。separator は ',' でコンマ、'\t' でタブ。デフォルトでは(何も指定しないと)コンマ区切りになる。EOL char は改行文字。デフォルトでは、CRLF か LF になっている。何も指定しないで使っても普通は問題ないと思う。

で、これをブロックにして使う。読み込むときは、一行ごとに配列で読み込まれ、書き込むときは一行ごとに配列を追加していく形で使う。

CSV.open(filename, 'r') do | reader |

ここで配列 reader を処理する

end

これは読み込みの例。ary という配列の配列(一行ごとに複数の要素が入っているスプレッドシートみたいなもの)をブロックでひとつずつ取り出して、それを csv に一行ごとに書き込んでいく。

CSV.open(filename, 'w') do | writer |

ary.each do | item |

writer << item

end

end