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