Rubyでファイルを読み出す
前回は文字列の操作について書きました。最後はファイルの読み出しについて書きます(`・ω・′ )
読み出し用に、以下のコードを書いた 1plus2.rb ファイルをrubyフォルダに保存しておいて下さい。
x=1+2
puts(x)
ファイルを読みだして表示する
次のようにファイル名とフラグを指定します。フラグは開く状態を指定できますが、なければ r(読み取り専用)で開かれます。
open(“ファイル名“,”フラグ“)
実際に先ほど作成した 1plus2.rb を開き、内容を読みだして表示し、ファイルを閉じてみます(・ω・)ノ
file=open(“1plus2.rb”,r)
puts(file.read)
file.close
x=1+2
puts(x)
1plus2.rb の内容が表示されました。これを更に簡略化すると、
puts(File.open(“1plus2.rb”).read)
となります(ノ)・ω・(ヾ)
each_line メソッドを使って1行ずつ読み込む場合、
file=open(“1plus2.rb”,”r”)
file.each_line do |line|
puts(line)
end
file.close
と書きます(・ω・)ノ
フラグの種類
フラグには次のような種類があります。
フラグ | 動作 |
---|---|
r | 読み込みモード |
r+ | 読み書き両用モード |
w | 新規作成+書き込みモード |
w+ | 新規作成+読み書き両用モード |
a | 追記モード |
a+ | 追記読み込み両用モード |
ファイルに書き込み、それを読み出す
次は空のファイル write.rb にフラグ”w”を使って何かを書き込み、それを表示させてみます(`・ω・′ )
まず、write.rb をフラグ “w” で開き、puts() を使って書き込みます。
#あらかじめrubyフォルダに write.rb ファイルをつくっておく
#書き込む
file_w=open(“write.rb”,”w”)
file_w.puts(“こんにちは”)
file_w.close
#読み込む
file_r=open(“write.rb”,”r”)
puts(file_r.read)
file_r.close
こんにちは
読み込んだファイルに行番号をつける
lineno メソッドを使います(・ω・)ノ
まず、1から10まで並べた 1to10.rb を用意します(`・ω・′ )
1
2
3
4
5
6
7
8
9
10
次に、ファイルを開いて1行ずつ読み込んで表示させながら、各行の先頭に行番号を振っていきます。
file=open(“1to10.rb”,”r”)
file.each_line do |line|
print(file.lineno,”行目:”,line)
end
file.close
1行目:1
2行目:2
3行目:3
4行目:4
5行目:5
6行目:6
7行目:7
8行目:8
9行目:9
10行目:10
桁数を揃えるには、printf() メソッドを使います(・ω・)ノ
printf(“文字列“,式)
式の戻り値(計算結果)を %d を使って文字列に挿入できます。%d の間に数値を入れることで桁数を指定(固定)できます。3桁に統一するなら %3d とします(・ω・)ノ
file=open(“1to10.rb”,”r”)
file.each_line do |line|
printf(“%3d行目:”,file.lineno)
end
file.close
これで桁数が揃えられました(ノ)・ω・(ヾ)
ファイル一覧を表示する
あるフォルダ(ディレクトリ)にあるファイルを一覧で表示させるには Dir.open メソッドを使います(・ω・)ノ
Dir.open(フォルダのパス)
フォルダのパス部分に直接パスを入力しても構いませんが、このプログラムを実行する際にターミナル(コマンドプロンプト)で次のように指定し、ARGV[0] という配列で用いる方法もあります。
ファイル一覧を表示するプログラムを list.rb とし、ディレクトリのパス(ユーザ名をtakenoriとする)を /Users/takenori/ruby とすると、ターミナル(コマンドプロンプト)には次のコマンドを入力します。
ruby list.rb /Users/takenori/ruby
list.rb のコードは次の通り。
folder=ARGV[0]
d=Dir.open(folder)
d.each do |f|
puts(f)
end
.
..
.DS_Store
ruby1.rb
ruby2.rb
ruby3.rb
ruby4.rb
ruby5.rb
ちなみに、「.」は現在のディレクトリ、「..」はひとつ上のディレクトリを指します。「.DS_Store」はMacのディレクトリに関する設定情報が入ったファイルです。Macのパソコンや、Macに接続して使用したUSBメモリなどに入ってます。この3つは特に気にする必要はありません(・ω・)ノ
ログを保管する
ファイルの一覧をログファイル(例:log.txt )に保管するにはターミナル(コマンドプロンプト)に次のように入力します。
ruby list.rb /Users/takenori/ruby >log.txt
実行後、rubyフォルダに log.txt が保存されます。なお、>>log.txt という具合に >> を使用すると追記になりますので、log.txt がどんどん大きくなっていきます(・ω・)ノ
ログ日時を記録
Time.new メソッドを list.rb に追記すればログ日時が記録されます(・ω・)ノ
folder=ARGV[0]
d=Dir.open(folder)
puts(“——“)
print(“記録日時は”,Time.new(),”です。\n”)
puts(“——“)
d.each do |f|
puts(f)
end
——
記録日時は2014-09-13 11:33:36 +0900です。
——
.
..
.DS_Store
ruby1.rb
ruby2.rb
ruby3.rb
ruby4.rb
ruby5.rb
正規表現で余分な文字列を省く
正規表現と next 文を使います。
next文とは
next 文はループ処理の中で使い、next以降の処理を行わず次のループに進みます。次のコードがループ処理中に現れると、条件を満たした場合に次のループに進みます。
next if 条件
条件は、「.(ドット)から始まる文字列が変数 f と一致した場合」とします。これで「.」「..」「.DS_Store」の3つの文字列は条件を満たすためループ処理から飛ばされ、表示されません。
正規表現を使う
正規表現とは、文字列の集合を1つの文字列で表す方法です。何が正規なの?という感じですが、難しく考える必要はありません(・ω・)ノ
例えば「a,b,cのいずれか1文字」をシンプルに「[a-c]」と表したりする、それが正規表現です。
「 .(ドット)から始まる文字列」を正規表現を使って表現してみます。正規表現の範囲は / / で囲みます。
/正規表現/
正規表現において、「 . 」(ドット)は「任意の1文字」を表すため、「 \. 」と表記します。「〜から始まる」は「^〜」と表記するため、「 .(ドット)で始まる文字列」は次のように表現します。
/^\./
この正規表現が each メソッドで取り出される変数 f と一致する場合、next 文でputs(f) を飛ばして次のループ処理へ進むとします。
なお、正規表現と変数 f の中の文字列の一致は == ではなく =~ (正規表現と文字列の一致)を使用します。
folder=ARGV[0]
d=Dir.open(folder)
puts(“——“)
print(“記録日時は”,Time.new(),”です。\n”)
puts(“——“)
d.each do |f|
next if f=~/^\./
puts(f)
end
——
記録日時は2014-09-13 12:28:40 +0900です。
——
ruby1.rb
ruby2.rb
ruby3.rb
ruby4.rb
ruby5.rb
すっきりしました。これで以上になります(・ω・)ノ
まとめ
Rubyの初歩的なことをさらっと書きましたが、これでRubyを使いこなせるわけではないので、体系的にRubyを学べる楽しいRubyなどの専門書を1日10〜30ページのペースで読破してモノにすれば十分だと思います(ノ)・ω・(ヾ)