過去の反響-フレームワークデータベース3からデータを取得する

この記事では、私に最近発生した状況と、それを解決するために採用された方法についてお話したいと思います。 私はプロのプログラマーではありませんが、少しの経験がこの問題の解決に役立ちました。



この記事では、プログラミング言語の「一般的なフレームワーク」については説明せず、ms dosの古い「フレームワーク」と、このデータをさらに変換してデータを保存する形式の分析に焦点を当てます。最新のデータベース形式の1つ。



プレストーリー

私は市立大学の学生であり、「水生生物資源と海洋養殖」の専門分野を勉強しています。すでに述べたように、私はプロのプログラマーではありませんが、卒業作業につながる練習を始めたとき、プログラミングスキルは取り残されていませんでした。



私の仕事の仕事の1つは、魚の特定の数の形態計測パラメーターを分析することでした。 ただし、おそらく既に推測されているように、ソースデータは手書き形式でした。 データサイズの比representation的な表現については、これは各インスタンスの40個のパラメーター(魚、よく、技術者-データベースの40列)とサンプルサイズ-188匹の魚(そして結果として-188行、40の塗りつぶされた列)です。



このデータを任意のデータベースに手動で入力することは、最も合理的なソリューションではありません。 1994年にこのデータを分析した実践メンターから「このデータの電子版はありますか」という質問で問い合わせると、肯定的な回答が得られました。 その後、5インチフロッピーディスクから正常にコピーされ、分析のために持ち帰られました。 成功は近いと思われ、大量のボタン操作が私を迂回しました。 それはそうでしたが、完全ではありませんでした。



データ分析

フロッピーディスクからコピーしたデータを開くと、最初に目を引いたのはファイル拡張子(.FW3)でした。 私はまだそのようなフォーマットに遭遇していません、そして、当然、私は最初にアドバイスのために私のお気に入りの検索エンジンに頼りました。 ほとんどすぐに、これがOSの第3バージョンのフレームワークの形式であることが明らかになりました。 このソフトウェア製品の最新バージョンは10です。この製品の作成者のWebサイトを読んだ後、入手するのは簡単ではないことがわかりました(有料)。 トレントトラッカーやこのソフトウェア製品の他のソースによる検索でも何も得られなかったため、受信したファイルの形式の分析を開始することが決定されました。



この形式の各テーブルには3つのファイルがありました(テーブル名がtableであると仮定します):





いくつかのインデックスファイル(table_I.FW3)の剖検により、特定のパターンが示されました。



これで、解析する列の先頭と末尾を安全に見つけることができました。



同様の状況が文字列ストレージで繰り返されました:



ただし、ここでは、区切り記号はテーブルの開始と終了だけでなく、行の開始と終了も示しています。



経験の浅いプログラマーでさえ、そのようなパターンの存在は、データをプログラムで任意の形式に変換できることを明確に示しています。 私の場合、十分な経験があったため、データウェアハウスとしてmysqlが選択されました。



データ変換

手元には沢山の沼があったため、データマイニングにはphpが選択されました(ただし、これは最適なソリューションではないかもしれませんが、このタスクには言語の機能で十分です)。



このタスクの実装のためにクラスの実装を200行で説明するには、このリソースは必要ないと思います。 以下にソースコードを示します。そのようなファイルを変換するときに誰かの助けになるかもしれません。

パーサークラス
$config = array( 'url' => 'http://localhost', 'db_host' => 'localhost', 'db_user' => 'mysql', 'db_pass' => 'mysql', 'db_name' => 'fish' ); class dataMiner { private $database = null; private $file_byte_column = null; private $file_byte_table = null; private $filename = null; //    private $string_column_array = array(); private $string_table_array = array(); //     private $column_byte_point = array(0, 129, 1, 255, 129, 5, 0); private $row_start_point = array(0, 129, 1, 255, 129, 8, 0); private $row_string_point = null; //    private function db() { global $config; if($this->database == null) { try { $this->database = new PDO("mysql:host={$config['db_host']};dbname={$config['db_name']}", $config['db_user'], $config['db_pass']); $this->database->setAttribute(PDO::MYSQL_ATTR_INIT_COMMAND, "SET NAMES utf8"); } catch(PDOException $e) { exit("Database connection error ".$e); } } return $this->database; } /** **   */ public function open($file_fw3_name) { $this->filename = $file_fw3_name; $this->file_byte_column = file_get_contents('db/'.$file_fw3_name.'_I.FW3'); $this->file_byte_table = file_get_contents('db/'.$file_fw3_name.'_T.FW3'); return $this; } //         //    //    $this->string_column_array //         public function makeReadable() { //          $point_string = $this->byteToString($this->column_byte_point); $start_point = strpos($this->file_byte_column, $point_string); $end_point = strpos($this->file_byte_column, $point_string, $start_point+1); $length = $end_point - $start_point; $column_string = substr($this->file_byte_column, $start_point+strlen($point_string), $length-strlen($point_string)); $column_array = explode(" ", $column_string); foreach($column_array as $value) { if(strlen($value) > 0) { $this->string_column_array[] = $value; } } //           $this->row_string_point = $this->byteToString($this->row_start_point); $table_start = strpos($this->file_byte_table, $this->row_string_point); $table_end = $this->findEndPoint(); $table_length = $table_end-$table_start; $row_string = substr($this->file_byte_table, $table_start, $table_length); $line_row = explode($this->row_string_point, $row_string); $i_j = 1; //    for($i=1;$i<=sizeof($line_row);$i++) -     foreach($line_row as $single_row) { if(strlen($single_row) > 0) { $item_array = explode(" ", $single_row); foreach($item_array as $field) { if(strlen($field) > 0) $this->string_table_array[$i_j][] = $field; } $i_j++; } } } /** **       */ private function findEndPoint($start = 0, $before_starter = 0) { //    ? if($start == 0) { $start = strpos($this->file_byte_table, $this->row_string_point); } if(FALSE === ($end = strpos($this->file_byte_table, $this->row_string_point, $start+1))) { return $before_starter; } return $this->findEndPoint($end+1, $start); } /** **       */ public function byteToString($data) { return call_user_func_array("pack", array_merge(array("C*"), $data)); } public function storeDb($table) { // ..        prepared statement - ,    //    -     )) $column_size = sizeof($this->string_column_array); $create_query = "CREATE TABLE IF NOT EXISTS `{$table}` ( `table` VARCHAR( 24 ) NOT NULL ,"; $insert_query = "INSERT INTO `{$table}` (`table`, "; for($i=0;$i<sizeof($this->string_column_array);$i++) { if($i==(sizeof($this->string_column_array)-1)) { $create_query .= "`{$this->string_column_array[$i]}` decimal(24,2) NOT NULL DEFAULT '0.00'"; $insert_query .= "`{$this->string_column_array[$i]}`"; } else { $create_query .= "`{$this->string_column_array[$i]}` decimal(24,2) NOT NULL DEFAULT '0.00' , "; $insert_query .= "`{$this->string_column_array[$i]}`, "; } } $create_query .= " ) ENGINE = MYISAM ;"; $insert_query .= ") VALUES "; $s = 1; foreach($this->string_table_array as $row_array) { $field_size = sizeof($row_array); $insert_query .= "( '{$this->filename}', "; foreach($row_array as $field) { $insert_query .= "'{$field}', "; } $null_diff = $column_size-$field_size; for($i=1;$i<=$null_diff;$i++) { if($i==$null_diff) { $insert_query .= "'0.00'"; } else { $insert_query .= "'0.00', "; } } if($s == sizeof($this->string_table_array)) { $insert_query .= " );"; } else { $insert_query .= " ), "; } $s++; } $this->db()->query($create_query); $this->db()->query($insert_query); } public function clean() { $this->file_byte_column = null; $this->file_byte_table = null; $this->string_column_array = array(); $this->string_table_array = array(); } }
      
      





クラスを使用してFW3からmysqlデータベースにデータを解析する例(ソーステーブルFW3 M1 _ *。FW3、mysql bio_trachurusのターゲットテーブル):

 //   $miner = new dataMiner; //     fw3       $miner->open('M1')->makeReadable(); //              $miner->storeDb('bio_trachurus');
      
      







結果

その結果、私が都合の良い形式で観察結果を分析するために必要な観察結果を受け取り、手動で入力する余分な時間の無駄を省きました。







例とともにgithubで公開されたソースコード。



追伸 -コードの品質を強くscるな



Ppc-trachurusは、一部のユーザーの考えられることとは関係ありません。 Wikiで絞り込む



All Articles