Previous: Mcsvout CSVの書き込みクラス Up: クラス Next: Mtable CSVデータのセル単位での読み込み操作クラス RubyM
RubyM : クラス : Margs 引数操作クラス

2.3 Margs 引数操作クラス

コマンドライン引数を扱うクラス。 以下のような特徴を持つ。

  • keyword=value および -keyword の二つのフォーマットの引数を扱う。

  • -keywordはオプションで、Bool型(true/false)に変換される。

  • valueの型としては、Rubyの原型として、String配列、Fixnum配列、Float配列を扱うことができる。

  • その他の特殊な型として、ファイル型や項目名型を提供する。

  • デフォルト値や値の範囲を指定することができる。

  • 指定が正しくなければエラーメッセージを表示して終了する。

  • --helpが指定されればhelp()を呼び出し終了する。またヘルプ関数名を指定することも可能。--helpは、一般のオプションとは違い、マイナス記号が2つであることに注意する。

2.3.1 メソッド

* MCMD::Margs.new(ARGV[,allKeyWords][,mandatoryKeyWords][,helpFunction)

Margsオブジェクトを生成する。 「keyword=値」もしくは「-keyword」の形式で与えられたコマンドライン引数が、クラス内部のHashもしくはArray変数にセットされる。

ARGV RubyのARGV変数。

allKeyWords key=valueもしくは-keyによる引数キーワードリスト。 ここで指定した以外の引数がARGVに指定されていないことをチェックし、 指定されていればエラー終了してくれる。 allKeyWordsを省略した場合はこのチェックをしない。

mandatoryKeyWords key=valueによる引数キーワードリスト。 ここで指定した引数がコマンドラインで指定されていなければ エラー終了してくれる。 mandatoryKeyWordsを省略した場合はこのチェックをしない。

helpFunction --helpが指定されたときに呼び出される関数名。

# コマンドライン
$ ruby test.rb i=dat.csv -abc

# test.rbの内容
args=Margs.new(ARGV, "i=,v=,-abc") # OK
args=Margs.new(ARGV, "i=,v=") # -abcは指定できないのでエラー終了
args=Margs.new(ARGV, "i=,v=,-abc","i=,v=") # v=は必須だが指定されてないのでエラー終了

* MCMD::Margs.file(keyWord,mode): ファイル名の取得

keyWord key=形式のキーワード(String)

mode "r"(readableのチェック)、もしくは"w"(writableのチェック)を指定する。(String)

keywordで指定された値を入力ファイル名とみなし、modeが"r"の場合、 そのファイルが読み取り可能であればそのファイル名を返す。 読み取りが可能でなければエラー終了する。 modeが"w"の場合は、書き込みを行うディレクトリに書き込み可能かどうかチェックし、 書き込み可能であればそのファイル名を返す。 書き込み可能でなければエラー終了する。

# コマンドライン
$ ruby test.rb i=dat.csv

# test.rbの内容
args=Margs.new(ARGV)
puts args.file("i=","r") # dat.csvがreadableであれば"dat.csv"
puts args.file("i=","w") # カレントディレクトリがwritableであれば"dat.csv"

* MCMD::Margs.field(keyWord,fileName)
keyWordで指定した項目名について、fileNameで指定されたファイルの項目 と関連付けて各種情報を返す。

keyWord "key="形式のキーワード(String)。

fileName ファイル名。

コマンドラインでの項目名の指定は以下のフォーマットに従わなければならない。

  \begin{equation}  \verb/key=/name_1\verb/[:/newName_1\verb/%/option_1\verb/],/name_2\verb/[:/newName_2\verb/%/option_2\verb/],/\ldots \end{equation}   (2.3)

複数の項目名はカンマで区切って指定する。 $name_ i$は、fileNameで指定されたCSVファイルの項目名でなければならない。 さもなければ"field name not found"のエラーにて終了する。

項目名$name_ i$には二つの属性$newName_ i$と$option_ i$を指定できる(省略可)。 それぞれ用途は自由であるが、:と%で区切らなければならない。

一般的な用途としては、ある項目$name_ i$に対する演算結果を 新しい項目名$newName_ i$として追加出力することを想定している。 そして$option_ i$は処理内容を制御するオプションとして利用する。

このメソッドは、以下に示す各種情報をHashで返す。太字はHashキー。

names 項目名namesの配列(String Array)。

newNames 新項目名newNamesの配列(String Array)。指定がなければnil。

options オプションoptionsの配列(String Array)。指定がなければnil。

fld2csv "key="で指定された項目に対応するCSVファイル(fileName)の項目番号(0から始まる)(String Array)。

csv2fld CSVファイルの項目番号を要素番号とした"key="で指定された項目の指定順序番号(0から始まる)(String Array)。 指定のない項目はnil。

# test.csvの内容
fld1,fld2,fld3
1,2,3
4,5,6

# コマンドライン
$ ruby test.rb f=fld1,fld3

# test.rbの内容
args=Margs.new(ARGV)
fld=args.field("f=","test.csv")
p fld["names"]   # -> ["fld1","fld3"]
p fld["fld2csv"] # -> [0,2] fld1,fld3はtest.csvの0番目と2番目の項目に対応
p fld["csv2fld"] # -> [0,nil,1] test.csvの0番目の項目はf=の0番目に指定された

# コマンドライン
$ ruby test.rb f=fld3:newFld3%n,fld2%nr

# test.rbの内容
args=Margs.new(ARGV)
fld=args.field("f=","test.csv")
p fld["names"]    # -> ["fld3", "fld2"]
p fld["newNames"] # -> ["newFld3", nil]
p fld["options"]  # -> ["n", "nr"]
p fld["fld2csv"]  # -> [2, 1]
p fld["csv2fld"]  # -> [nil, 1, 0]

* MCMD::Margs.str(keyWord[,default][,token1][,token2])
文字列引数の取得

keyWord "key="形式のキーワード(String)

default 指定がなかったときのデフォルト値。省略時はnil。

token1 複数の文字列を指定する場合の区切り文字。省略時は区切りは無いものと見なす。

token2 token1で切り出された文字列をさらにtoken2を区切りとする文字列で区切る。省略時は区切りは無いものと見なす。

コマンドライン上で指定された引数のうち、keyWordとマッチする値を文字列として返す。 コマンドラインで指定されていなければdefaultの文字列を返す。 この時defaultがnilであればnilを返す。

token1が指定されていれば区切られた文字列を要素とする配列を返す。 さらにtoken2が指定されていれば、配列の配列を返す。

# コマンドライン
$ ruby test.rb v=abc

# test.rbの内容
args=Margs.new(ARGV)
puts args.str("v=") # ->"abc"
puts args.str("w=") # -> nil
puts args.str("w=","xyz") # -> "xyz"
# コマンドライン
$ ruby test.rb v=abc,efg:xyz,hij

# test.rbの内容
args=Margs.new(ARGV)
puts args.str("v=") # ->"abc,efg:xyz,hij"
puts args.str("v=",nil,",") # ->["abc", "efg:xyz", "hij"]
puts args.str("v=",nil,",",":") # ->[["abc"], ["efg","xyz"], ["hij"]]

* MCMD::Margs.float(keyWord[,default][,from][,to]): Float型数値引数の取得

keyWord “key=”のキーワード(String)

default 指定がなかったときのデフォルト値(Float)。省略時はnil。

from 範囲チェックの下限値(Float)。省略時は下限値チェックをしない。

to 範囲チェックの上限値(Float)。省略時は上限値チェックをしない。

コマンドライン上で指定された引数のうち、keyWordとマッチする値をFloatに変換して返す。 コマンドラインで指定されていなければdefaultの値を返す。 範囲チェックにパスしなければエラー終了する。

# コマンドライン
$ ruby test.rb v=0.12

# test.rbの内容
args=Margs.new(ARGV)
puts args.float("v=") # -> 0.12
puts args.float("v=",nil,0.2,0.3) # -> 範囲エラー
puts args.float("w=") # -> nil
puts args.float("w=",0.1) # -> 0.1

* MCMD::Margs.int(keyWord[,default][,from][,to]) Fixnum型数値引数の取得

keyWord key=のキーワード(String)

default 指定がなかったときのデフォルト値(Float)。省略時はnil。

from 範囲チェックの下限値(Float)。省略時は下限値チェックをしない。

to 範囲チェックの上限値(Float)。省略時は上限値チェックをしない。

コマンドライン上で指定された引数のうち、keyWordとマッチする値をFloatに変換して返す。 コマンドラインで指定されていなければdefaultの値を返す。 範囲チェックにパスしなければエラー終了する。

# コマンドライン
$ ruby test.rb v=10

# test.rbの内容
args=Margs.new(ARGV)
puts args.int("v=") # -> 10
puts args.int("v=",,20,30) # -> 範囲エラー
puts args.int("w=") # -> nil
puts args.int("w=",15) # -> 15

* MCMD::Margs.bool(keyWord) Bool型引数の取得

keyWord "-key"によるキーワード(String)

コマンドライン上で指定された引数のうち、keyWordとマッチする引数があればtrueを、なければfalseを返す。

# コマンドライン
$ ruby test.rb -flag

# test.rbの内容
args=Margs.new(ARGV)
puts args.bool("-flag") # -> true
puts args.bool("-x") # -> false

2.3.2 利用例

例1

# コマンドライン
$ ruby test.rb i=dat.csv v=value -abc

# test.rbの内容
args=Margs.new(ARGV, "i=,o=,w=,-flag,-x", "i=,w=")
iFileName = args.file("i=") # -> "dat.csv"
oFileName = args.str("o=","result.csv") # -> "result.csv"
weight    = args.float("w=",0.1,0.0,1.0) # -> 0.1
flag      = args.bool("-abc") # -> true
wFlag     = args.bool("-w") # -> false

2.3.3 関連コマンド

Previous: Mcsvout CSVの書き込みクラス Up: クラス Next: Mtable CSVデータのセル単位での読み込み操作クラス RubyM