以下のスクリプトはCSVファイルを読み込み、入力項目の項目数を制限してタブ区切りファイルとして出力するrubyのスクリプトです。
ここからは、「2-1-1.スクリプトの基本形」で述べたスクリプトに多少手を加えることで、基本的なスクリプトからさまざまな処理を行うスクリプトが作成できることについて、述べていきます。
入力データを編集して、出力データを作成する場合、入力データのうちの一部の項目だけを出力する場合があります。リレーショナル・データベース(relational data base)でいうところと、射影(projection)に相当するものですが、このような場合、sliceメソッドを利用することになります。
sliceメソッドの機能は、「元の変数」の「開始位置」から「終了位置」までの要素を抜き出して、別の変数に入れるというものです。指定方法は、
別の変数 = 元の変数.slice(開始位置..終了位置)
という形式で行います。また、sliceメソッドを利用せずに、"["(ブラケット)を利用して、
別の変数 = 元の変数[開始位置..終了位置]
としても同じです。
「2-1-1.スクリプトの基本形」のスクリプトを元に入力データの中の2番目から4番目までの項目だけを出力するスクリプトを具体的に例示します。抜き出す項目が少ない場合は、
out1 = [in1[1],in1[2],in1[3]].join("\t")
のように配列の要素を個別に「in1[1]」などと指定していく方法を採ることもできます。また、抜き出す項目が多い場合は、sliceメソッドで
temp = in1.slice(1..3)
または
temp = in1.slice(1,3)
や
temp = in1[1..3]
のように配列を抜き出してから、joinメソッドでまとめる方法を採ります。
なお、RubyではPerlのように配列全体を示すときに変数名の先頭に「@」(アットマーク)をつけません。また、Rubyでは何番目かを数えるために"0"から始めるという点は、Perlと同様に間違えやすいので、注意が必要です。すなわち、添字の[0]は要素の1番目を示し、添字の[1]は要素の2番目を示すことになります。
# inout2.rb # 内容 : 基本プログラム(1件入力し、1件出力するプログラム) # Copyright (c) 2002-2015 Mitsuo Minagawa, All rights reserved. # (minagawa@fb3.so-net.ne.jp) # 使用方法 : c:\>ruby inout2.rb # #入力ファイルをオープンする。(1) in1_file = open("input.txt","r") #出力ファイルをオープンする。(2) out1_file = open("output.txt","w") #1行単位で入力し、入力データが終了するまで繰り返す。(3) while (line1 = in1_file.gets) #行末の改行文字をカットする。(4) line1.chomp! #カンマで項目を分割する。(5) in1 = line1.split(",",-1) #抜き出す項目が少ない場合(2番目の項目から4番目の項目を抜き出す) out1 = [in1[1],in1[2],in1[3]]join("\t") #抜き出す項目が多い場合(2番目の項目から4番目の項目を抜き出す) temp = in1[1,3] #タブで項目をまとめる。(6) out1 = temp.join("\t") #1行出力する。(7) out1_file.print out1,"\n" end #入力ファイルをクローズする。(8) in1_file.close #出力ファイルをクローズする。(9) out1_file.close
Perlのsplice関数では、指定した「元の配列」が指定した「要素の個数」を抜き出しすようにしていますが、Rubyでは、配列の開始位置と終了位置を指定するなど、指定方法が異なっていますので、指定方法に注意してください。また、Perlでは抜き出した後の状態に変更されてしまいますが、Rubyの[a..b]メソッドやsliceメソッドでは、そのようなことはなく、Perlよりも安全になっています。