Rubyプログラミングの基礎まとめ(第7回)ファイルの読み書きとファイル一覧の表示

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ページのペースで読破してモノにすれば十分だと思います(ノ)・ω・(ヾ)

コメントを残す

サブコンテンツ

このページの先頭へ