PHPでsylkファイルをデータストレージとして使う
2007/05/26
id:smeghead:20070525:phpexcel では、sylkファイルから読んだ情報を2次元配列に格納していたが、
実用するなら、Hash(キーはカラム名)の配列で取得できるべきなので、改造した。
<?php /** * Excelから出力したsylk形式のファイルを読むクラス。 * 各カラムのデータをHashの配列に格納し返却する。 * * $reader = new SylkReader("path/to/sylk_file.slk"); * print_r $reader->get_data(); * 1行目のデータはカラム名として扱う。 * 2行目移行のデータをレコードとして扱います。 * 各レコードは、カラム名をキー、データを値としたHashに変換される。 * END_OF_DATAが1桁目に表れたらレコードの読み込みを終了する。 */ class SylkReader { private $data; public function __construct($file_name) { $contents = file_get_contents($file_name); $lines = split("\n", $contents); for ($i = 0; $i < count($lines); $i++) { $columns = split(";", $lines[$i]); //行の種類を格納する。 $line_type = array_shift($columns); $this->write_point_to($y , $x, $columns); if ($line_type != "C") continue; $col_data = $this->get_col_data($columns); if ($col_data == 'END_OF_DATA') break; if ($y == 1) { //1行目のレコードはカラム名として扱う。 $column_names[$x - 1] = $col_data; } else { $this->data[$y - 1][$column_names[$x - 1]] = $col_data; } } } private function get_col_data($columns) { foreach ($columns as $val) { if (substr($val, 0, 1) == "K") { return preg_replace("/^\"(.*)\"$/", "\\1", rtrim(substr($val, 1))); } } } /** * カラムの位置情報を取得し、引数のy xに格納します。 * ※y x は上書きします。 */ private function write_point_to(&$y, &$x, $columns) { foreach ($columns as $val) { $type = substr($val, 0, 1); if ($type == "X") { $x = substr($val, 1); } elseif ($type == "Y") { $y = substr($val, 1); } } } public function get_data() { return $this->data; } } ?>
sylk形式のフォーマットを知らずに、excelが出力した結果を見ながらやってるから、もぐらたたきになってしまいます。
phpでクラスを作る方法は、わかりました。(というか、至って普通に書けますよというのがわかった)
※汎用的に使うにはいろいろとダメみたい。今後、修正していきます。