お題
次のファイルの行数を取得せよ。
test test test test test
ファイル名test_file.rb
(ファイル場所は実行ファイルと同一ディレクトリにあるものとする)
回答
str = File.read("./test_file.rb") p str.lines.count
説明
ファイルの内容を取得する方法はいろいろあるが、Fileクラスのreadメソッドを使った。引数にはファイル名を入れる。
str = File.read("./test_file.rb")
./
は省略できるが、.rb
を省略するとエラーが出るので注意。拡張子は入れること。
No such file or directory @ rb_sysopen - test_file (Errno::ENOENT)
以上の方法を使うと、Stringクラスのインスタンスが返ってくる。
p str.class #=> String
lines.countを使えば行数が取得できる。
p str.lines.count
文字はないが改行だけしてあるファイルの場合
たとえば、文字はないけど改行だけしてあるファイルの場合を考える。
1 test 2 test 3 test 4 test 5 test 6 7 8
(わかりやすくするため、行数を書いている)
カウントすると
p str.lines.count #=> 8
となる。 文字列を取得し、改行文字を見てみると・・・
"test\ntest\ntest\ntest\ntest\n\n\n\n"
後ろに改行文字たちがわんさか。
配列で取得してみると、こうなる。
["test\n", "test\n", "test\n", "test\n", "test\n", "\n", "\n", "\n"]
おそらくだが、これがカウントされてるのではないかと推測。 たとえば、最初に使った5行のファイルに、改行をいれて6行にしてみる。
test test test test test
(文字は5行だが、6行目に改行文字が入っている)
これをstr.lines.countしてみると、行数は5と表示される。配列で取得してみると、
["test\n", "test\n", "test\n", "test\n", "test\n"]
1番最後のtest
という文字列の後ろに\n
が入っていることになっている。
改行数だけをカウントするには
完全に改行数、つまり\n
だけをカウントするには、こうする。
str = File.read(ファイル名もしくは変数) str.count("\n")
よって、たとえばソースコードが20行だったとしても、最後の行に改行文字がなく、改行数が19ならば、19が取得される。 wcコマンドと同じ。 ややこしー
FIleクラスはIOクラスのサブクラス
ちなみに、FileクラスはIOクラスのサブクラスなので、IOクラスで定義されているメソッドも使える。
ちなみにちなみに、IOクラスではこんなこともできる。
文字列をそのまま取得。
# 文字列をそのまま取得 p IO.read("./test_file.rb") => "test\ntest\ntest\ntest\ntest"
文字列を配列に入れて取得。
# 文字列を配列にして取得 p IO.readlines("./test_file.rb") => ["test\n", "test\n", "test\n", "test\n", "test"]