hirax.net::inside out::2009年06月22日

最新記事(inside out)へ  |   年と月を指定して記事を読む(クリック!)

2009年5月 を読む << 2009年6月 を読む >> 2009年7月 を読む

2009-06-22[n年前へ]

ドラッグ&ドロップしたファイルからデータを抽出するRubyスクリプト・サンプル 

 「ささやかだけれど、役に立つこと」が、きっとあるだろう、と思っています。本屋に行けば、たくさんHOW TO本が溢れています。けれど、意外に、HOW TO本という割には、そこにはスローガンのような曖昧なことしか書かれていないことも多い、と感じることがあります。あるいは、Geek好みではあるけれど、そうでない人を想定読者にしていない本も多いように思います。

 今日は、「(Windowsで)ドラッグ&ドロップしたテキスト・ファイル中から特定の行・列を抽出するスクリプト」のRubyサンプルを書いてみました。つまりは、誰でもすぐに書ける使用例です。・・・とはいえ、実験データの解析をしようとすると、必要になることが多そうなサンプルです。

 けっしてすごいことができるわけではありませんが、意外にこんなスクリプトを実際に使い・役立てて、そして自分で道具を作り始めることのきっかけのひとつになる可能性もあるかもしれないと思い、書いてみました。

 下のスクリプトは、HEADER_LINE_NUMで定義した行より後の行から、(スペースで区切った時の)2・3列目だけを抽出したcsvファイルを作ります。もしも、1,9行目をコメントにして、2,10行目をコメントアウトすると、pickupLineで定義した行からだけデータを抽出します。何だか、こんな説明を書くことも、少し気恥ずかしく感じてしまうようなサンプルですが、けれど、意外にこういう入門の入門の情報が「ささやかだけれど、役に立つこと」なのかもしれないと思い、ふと仕立ててみました。

HEADER_LINE_NUM=5
#pickupLine=[23,24,26,28]
ARGV.length.times{ |i|
  data=[]
  filename=ARGV[i]
  open(filename) {|file|
    lineNum=1
    file.readlines.each{|line|
      if lineNum>HEADER_LINE_NUM
#      if pickupLine.include?(lineNum)
        lineData=line.split(' ')
        data<<[ lineData[2], lineData[3] ] 
      end
      lineNum+=1
    }
  }
  isFirst=true
  f=File.open(filename.gsub('.txt','')+'.csv','w')
  data.each{|l|
    if isFirst
      f.puts 'a,b' # print caption
      isFirst=false
    end
    f.puts l[0].to_s+','+l[1].to_s    
  }
  f.close
}