テキストファイル入力のメモ

私はRubyをテキストファイルを一行ずつ入力し、処理して出力するという用途でよく使う。その時のメモ。

よく使うのはIOクラスでファイルを読み込む方法。

#!/usr/bin/ruby
#IO.rb

in_file = ARGV.shift

IO.foreach(in_file) do |line|
  if line =~ /^http\:\/\/d\.hatena\.ne\.jp\/(.+?)\//
    id = $1
    puts id
  end
end

この例では"http://d.hatena.ne.jp/id/"からidを抜き出して出力する。urlset.txtにURLが一行ずつ書かれているとしてこう使う

$ ruby IO.rb urlset.txt

次は標準入力を使う方法。

#!/usr/bin/ruby
#stdin.rb

$stdin.each_line do |line|
  if line =~ /^http\:\/\/d\.hatena\.ne\.jp\/(.+?)\//
    id = $1
    puts id
  end
end

リダイレクトを用いてこう使う。

$ ruby stdin.rb < urlset.txt

もしくはパイプを使ってこう。

$ cat urlset.txt | ruby stdin.rb

上の例は入力が素のテキストファイルだったが、テキストファイルが巨大になるとgzで圧縮して扱いたい時もある。圧縮したものをurlset.txt.gzだとする。

添付ライブラリのzlibを使う方法。

#!/usr/bin/ruby
#gz.rb
require 'zlib'

in_file = ARGV.shift

Zlib::GzipReader.open(in_file).each_line do |line|
  if line =~ /^http\:\/\/d\.hatena\.ne\.jp\/(.+?)\//
    id = $1
    puts id
  end
end

IO.rbと同じようにこう使う。

$ ruby gz.rb urlset.txt.gz

上の標準入力を使うものにgzipを組み合わせることもできる。

$ gzip -dc urlset.txt.gz | ruby stdin.rb

標準入力を用いるとパイプで処理を続けることができる。実行権限を付けてあげればrubyと書かなくていいわけだし便利。