アマグラミング

プログラミング初心者が勉強したことを復習とメモがてら書いているだけです。

(76)コマンドラインでファイルを読み込む、マッチングする

ファイルを読み込んでみましょう。

 

指定したファイルの中身を表示するプログラムを作ります。

指定したファイルはこれから書くソースコードのファイルと同じフォルダに

入れておきましょう。

 

ファイルを開いて、テキストデータを読み込んで、それを出力して閉じる。

そんなものを書きます。

filename = ARGV[0]

file =File.open(filename)

text = file.read

print text

file.close

 

最初の行は、変数にコマンドラインから受け取った引数であるARGV[0]を代入しています。

次の行でfilenameを開いて、その次で読み込んで、その次で出力して

最後に閉じています。

で、詳しいことはここでは説明しませんが、そういう流れでやっています。

 

じゃあ実行してみましょう。

f:id:tiroru17:20170625071831g:plain

こんなふうになる。

 

単純に読み込むだけならもっと簡単にできるけど、

まあ、どうせ説明不足な状態だし、ここでは説明しない。

 

さて、この方法だと、まとめてデータを読み込んでいるので時間がかかるし

大きいファイルは困ったりする。

メモリ的にも困るらしい。

まあというわけで、一行ずつ読み込んで出力するようにする。

 

filename = ARGV[0]

file =File.open(filename)

file.each_line do |line|

print line

end

file.close

 

こんなふうに書くといい。

each_lineメソッドはファイルの各行を処理するメソッド

繰り返して、最終的に全て出力している。

 

ファイルの中から特定のパターンの行のみを出力する

ことも覚えましょう。

 

とりあえずかいてみます。

pattern = Regexp.new(ARGV[0])
filename = ARGV[1]

file = File.open (filename)
file.each_line do |line|
if pattern =~ line
print line
end
end
file.close

 

こんな感じですね。

 

よくわかんないですけど、Redgexpっていうのは元々ある

クラスのようですね。

 

最初に渡す引数にマッチするかどうか知りたい値を

2番目になんのファイルから調べるかを。

 

例えばmaという文字列を探すのなら

f:id:tiroru17:20170625090911g:plain

 

このように一致する行を出力してくれます。

 

一致しないとなんも返してくれない。

一致しない時はこうしてくれ、ってのを追加すればそうしてくれるけど。

elseでなんも設定してないからね。