PHPでsylkファイルをデータストレージとして使う

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でクラスを作る方法は、わかりました。(というか、至って普通に書けますよというのがわかった)

※汎用的に使うにはいろいろとダメみたい。今後、修正していきます。

コメントする

メールアドレスが公開されることはありません。 が付いている欄は必須項目です


reCaptcha の認証期間が終了しました。ページを再読み込みしてください。

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください