Just do IT

思うは招く

Ruby基礎問題100本ノック#6 ファイルの行数を取得する

お題

次のファイルの行数を取得せよ。

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"]