カスタム検索

2008年10月20日月曜日

どう書く?

どう書くネタで盛り上がったので、更にのってみました。

ものすごいハイウエスト日記

短くするのは得意じゃないんで、Groovyっぽい感じで


// 各行を処理するクロージャー
def changeLine1={ line,val ->
return line[2]
}
def changeLine2={ line,val ->
return line[1]
}
def add={line,val ->
return val.isNumber() ? val.toInteger()+1 : val
}

// CSV読み込み&変換
def convClo=["",changeLine1,changeLine2,add]
def ret=[]
def headers
new File("test.csv").splitEachLine("\t"){ line ->
if(!headers) headers = line
def lineData=[]
line.eachWithIndex { val,idx ->
lineData << (convClo[idx] ? convClo[idx].call(line,val) : val)
}
ret << lineData
}

// ソート関係
def sort="ID" // SortField
def order="ASC" // ASC | DESC
def headerIdx=0
headers.eachWithIndex{ val,idx ->
if(val==sort) headerIdx=idx
}

// 出力
println ret.remove(0).join("\t")
ret=ret.sort{it[headerIdx].isNumber() ? it[headerIdx].toInteger() : it[headerIdx]}
if(order.equalsIgnoreCase("DESC")) ret=ret.reverse()
ret.each{ println it.join("\t") }


後で増やしたり差し替えたり出来るように、クロージャーでデータの処理をわけてます。
(でもchangeLine1とchangeLine2は統合されるべきだよなぁ・・・)
ソートもフィールド名と ASC | DESC 与えて結果が変えられるようになってます。

と、思ったらもう答えが出ているわけで。

1 件のコメント:

nbqx さんのコメント...

のりましたねw