URAMIRAIKAN

1020のなれの果て (since 2005.6.19)

CSVファイルの行と列を入れ替えるPerlスクリプト

 タイトル以外の何ものでもありません。
 元々はVMware ESX/ESXiの"esxtop"コマンドの結果を整形する過程で作ったものだったりします。

 "esxtop -b"を実行すると列数が非常に多いCSVファイルが出力されます(Excelで開くと全部表示できないくらい)。
 しかも先頭の一行にオブジェクト名が並んでいるので、そのままでは"grep"による絞り込みもできなと。
 そんなこともあって作ったスクリプトでしたが、"esxtop"以外にも結構いろんな場面で役に立ってくれました。

#!/usr/bin/perl -w my (@tmpline, @tmplist); my ($numline, $tmpnum) = (0, 0); my ($i, $j, $k, $l) = (0, 0, 0, 0); while(<>){ $tmpline[$i] = $_; $i++; } while($j <= $#tmpline){ $tmplist[$j] = valcut($tmpline[$j]); $j++; } foreach $_(@tmplist){ $tmpline = $#{$_}; if($numline < $tmpline){ $numline = $tmpline; } } while($k <= $numline){ while($l <= $#tmplist){ if(defined ${$tmplist[$l]}[$k]){ print "${$tmplist[$l]}[$k]"; } if($l != $#tmplist){ print ","; } $l++; } print "\n"; $l = 0; $k++ } sub valcut{ my @tgtval = split(/,/, $_[0]); chomp(@tgtval); return(\@tgtval); }

 実行方法は"cat sample.csv | ./ch_l2c.pl"とかパイプで渡すだけです。結果を保存する場合はリダイレクトで。

 かなり昔に使ったものですが、最近も使ったので置いておきます。
 そういえば、最近はPerlが入っていない環境が多くなりましたね~。