2007-11-11 12:07:45
表計算ソフトは好きではないのであまり使わない。私の環境では256項目しか並べられないというのも不便に感じるし、まあ、書くと長くなるので書かない嫌いな理由が13個ほどあるのだ。
表計算ソフトでも便利だと思うことがあって、表の縦横を入れ替えるのが簡単だというのがその一つだ。数値だけが縦横に並んだリストなら、行列として取り込んで一瞬で転置行列を作るというのはRでやってしまえるのだけれども、Rを使わずにPHPで転置行列を作りたいこともある。PHPのスクリプトの中で転置行列を作りたい場合は、当然のことながらいちいちRを呼びだすよりもPHP内で処理した方がはやいし簡単だ。もちろん、そういうときは表計算ソフトは使えない。
行列はPHPの二次元配列で表現可能である。配列の配列を作れば簡単だ。実は、恥ずかしながらそんな二次元配列の項目をarray[i][j]で表現できる(アクセスできる)ということになかなか気づかなかった。前に一度発見していて、それを忘れて数カ月前に再発見したところである。もう二度と忘れないように、転置行列を作るスクリプトとともにここに記しておくことにする。
行列はコンマ区切りのCSVで保存してあるとする。これなら私の嫌いな表計算ソフトでも簡単に開ける。それがcsv.csvという名前で保存してあって、転置したものをtcsv.csvというファイル名で出力・保存されるようにしたのが、下のスクリプトである。
<?php $csv = file_get_contents("csv.csv"); $csv = ereg_replace("\x0D\x0A|\x0A|\x0D","\n",$csv); $lines = explode("\n",$csv); array_pop($lines); $array0 = array(); foreach($lines as $line){ $vals = explode(",",$line); $rno = count($vals); array_push($array0,$vals); } $lno = count($array0); $out = array(); for($r=0;$r<$rno;$r++){ $nline = array(); for($l=0;$l<$lno;$l++){ array_push($nline,$array0[$l][$r]); } array_push($out,$nline); } echo $lno."x".$rno."\n"; $output = ""; foreach($out as $oline){ $output .= implode(",",$oline); $output .= "\n"; } file_put_contents("tcsv.csv",$output); ?>最初に、Excelで保存すると改行コードが好みのものとは違っていることがあるので、\nで扱えるようにしている。数値だけの行列だけでなく、もちろん文字列の表もCSV形式になっていれば行と列を入れ替えられる。ファイル名を$argvで受け取るようにしておけば、何かと便利かも。