サンプルソース
対象ディレクトリのファイルの行数を合計します。
wcl.rb
files = Dir.glob("target/*.csv")
count = 0
files.each do |file|
File.foreach(file) {}
count += $.
end
puts count
【背景】wc -l
は、最終行の改行有無を吸収してくれない
ファイルの行数をみるのにwc -l
を使うことが多いのですが、残念ながら最終行に改行がないと1行扱いしてくれません。
不満はあれどファイルの最後に改行がつくかどうかはケースバイケースです。なんなら標準入力の最後に改行がつくかどうかも怪しいです。
CSVファイルなどは最終行に改行がなくともその後の処理系では問題なく処理されるので、なおさらファイル最後の改行の有無は混在します。
ということで、wc -l
ではどうにもならないので、別スクリプトを書くしかないということです。
ソースの解説
files = Dir.glob("target/*.csv")
汎用コマンドにするほどのことでもないので対象ディレクトリはハードコーディングです
File.foreach(file) {}
count += $.
一気にメモリに読み込むと大きなファイルがあったときにメモリ溢れとなりますので、foreachで行単位で読み込みます。行数を数えるだけなのでループ回すだけです。
そしてファイルが読み終わったら「読み終わった行数」を$.
というグローバル変数からもらいます。Perl文化ですね。
どういうシーンで使われるか
業務系システムって何かと「ファイルの納品ができたかどうか」が問われます。行数のチェックがやたらと多い。そんなわけで最終行の改行の有無が混在した状態での行数報告ってのは割と多いですよというお話でした。