No Programming, No Life

新しいNPNLです。http://d.hatena.ne.jp/fumokmm/ から引っ越してきました。

Re:タブ区切りデータの処理

お題: Server error
投稿: Server error

いまさら投稿してみた。分かりやすく書いたつもりです。

ポイント

  1. ヘッダとデータは #head(), #tail()を使って取得。
  2. ヘッダごと入れ替え時は、列を1本ずつ取得してから、#transpose()で行・列を入れ替え。

用意するファイル

test.tsv


ID Surname Forename Age
1 Sato Hanako 17
0 Suzuki Taro 18

ソース

// 入力
def list0 = new File('test.tsv').readLines()*.split('\t')
// 第1カラムの値でデータを昇順にソートする。
def list1 = [list0.head(), *(list0.tail().sort{it[0]})]
// 第2カラムと第3カラムをヘッダを含めて入れ替える。
def list2 = [
  list1*.getAt(0),
  list1*.getAt(2), // ←第2カラムと
  list1*.getAt(1), // ←第3カラムの入れ替え
  list1*.getAt(3)
].transpose()
// 第4カラムの値にそれぞれ1を加える。
def list3 = [list2.head(), *(list2.tail().collect{ [*(it[0..2]), it[3].toInteger() + 1] })]
// 出力
println """\
[入力時]
${ list0*.join('\t').join('\n') }

[出力時]
${ list3*.join('\t').join('\n') }\
"""

実行結果


[入力時]
ID Surname Forename Age
1 Sato Hanako 17
0 Suzuki Taro 18

[出力時]
ID Forename Surname Age
0 Taro Suzuki 19
1 Hanako Sato 18