Re: 分類付き m_sakumotsu

このトピックの投稿一覧へ

なし Re: 分類付き m_sakumotsu

msg# 1.1
depth:
1
前の投稿 - 次の投稿 | 親投稿 - 子投稿.1 | 投稿日時 2010.11.24 00:45 | 最終変更
OhYeah!  管理人   投稿数: 983 オンライン
FAMIC の作物概念図から作物マスターテーブル作成クエリーを自動生成するスクリプトの新版です。下記の点が変更されています。
1. クエリーのコメントに作物概念図の更新日を追加
2. 作物名に含まれるスペースや()[]を、現在の m_sakumotsu テーブルと同様に半角に変換するように変更
3. If-Modified-Since 及び Etag による更新チェックに対応

前バージョン同様、下記で試せます。
http://macs.o-ya.net/data/m_sakumotsu.php

実際に m_sakumotsu を書き換えると ACFinder が使えなくなってしまうので、新作物マスターを評価できるように、m_sakumotsu2 テーブル作成クエリーを生成するスクリプトもあります。
http://macs.o-ya.net/data/m_sakumotsu2.php

<?php
/* 初期設定 */
$url = 'http://www.acis.famic.go.jp/ddata/sakumotugainen.htm';
$tbl = 'm_sakumotsu';
$sql = "./$tbl.qry";
$inc = './sakumotsu.inc.php';

mb_internal_encoding('utf8');
error_reporting(E_ALL & ~(E_WARNING | E_NOTICE | E_DEPRECATED));

if (file_exists($sql)) {
  // 自動設定変数インクルード
  if (file_exists($inc)) include_once $inc;

  // If-Modified-Since より $lmdate が新しい場合は sql ファイルをそのまま出力
  $reqheaders = apache_request_headers();
  $sincedate = $reqheaders['If-Modified-Since'];
  if ($sincedate) $since = strtotime($sincedate);
  if ($lmdate) $lm = strtotime($lmdate);
  if ($lm > $since) {
    if ($lmdate) header("Last-Modified: $lmdate");
    if ($etag) header("Etag: $etag");
    header('Content-Type: text/plain; charset=Shift_JIS');
    echo file_get_contents($sql);
    exit;
  }
}

/* FAMIC 作物概念 HTML を取得 */
// HTTP アクセスライブラリのロードと設定
require_once 'HTTP/Request.php';
$client = new HTTP_Request($url);
$client->setMethod(HTTP_REQUEST_METHOD_GET);
// $lmdate が空文字列でなければ If-Modified-Since リクエストヘッダを設定
if ($lmdate) $client->addHeader('If-Modified-Since', $lmdate);
// $etag が空文字列でなければ If-None-Match リクエストヘッダを設定
if ($etag) $client->addHeader('If-None-Match', $etag);
$client->sendRequest();
$code = $client->getResponseCode();
// レスポンスコードが 200 (Ok) 以外ならそのまま終了
if ($code != 200) {
  if ($lmdate) header("Last-Modified: $lmdate");
  if ($etag) header("Etag: $etag");
  header('HTTP', true, $code);
  exit;
}

// インクルードファイル出力
$lmdate = $client->getResponseHeader('last-modified'); // レスポンスヘッダの値を設定
$etag = $client->getResponseHeader('etag'); // レスポンスヘッダの値を設定
$data  = "<?php\n";
if ($lmdate) $data .= "\$lmdate = '$lmdate';\n";
if ($etag) $data .= "\$etag = '$etag';\n";
$data .= "?>\n";
file_put_contents($inc, $data, LOCK_EX);

/* 作物概念 HTML -> SQL 変換 */
$trs = preg_split('{</tr>}i', str_replace(array("\r", "\n"), '', mb_convert_encoding($client->getResponseBody(), 'utf8', 'auto')));
// 作物概念更新日取得
$tds = preg_split('{</td>}i', array_shift($trs));
while ($td = array_shift($tds)) {
  if (strpos($td, '年') === false) continue;
  $td = preg_replace('/^.*?>/', '', $td);
  $td = preg_replace('{<rt>.*?</rt>}i', '', $td);
  $td = preg_replace('{<span.*?</span>}i', '', $td);
  $td = preg_replace('{</?ruby>}i', '', $td);
  $title = mb_convert_encoding("作物マスター $td", 'sjis-win', 'utf8');
  break;
}

$data  = "--/d\r\n";
$data .= "/* $title */\r\n";
$data .= "drop table if exists $tbl;\r\n";
$data .= "create table $tbl (idsaku integer primary key autoincrement, id1 integer, id2 integer, id3 integer, id4 integer, id5 integer, sakumotsu varchar);\r\n";
$data .= "begin transaction;\r\n";

// 作物階層取得
while ($tr = array_shift($trs)) {
  if (strpos($tr, '階層') > 0) continue;
  $tds = preg_split('{</td>}i', $tr);
  if (count($tds) <= 2) continue;
  $level = 0;
  while ($td = array_shift($tds)) {
    $str = preg_replace('/.*>/', '', $td);
    if ($str == '│') {
      $level++;
      continue;
    }
    $str = str_replace(array(' ', ' '), '', $str);
    if ($str == '') {
      if (preg_match('/colspan=[\'\"]?([0-9]+)[\'\"]?/', $td, $matches)) {
        $level += $matches[1];
      } else {
        $level++;
      }
      continue;
    }
    if ($str == '├' || $str == '└') {
      $id[$level]++;
      for($i = $level + 1; $i <= 4; $i++) $id[$i] = 0;
      $td = array_shift($tds);
      $item = mb_convert_encoding(mb_convert_kana(preg_replace('/.*>/', '', $td), 'KVas'), 'sjis-win', 'utf8');
      $data .= sprintf("insert into $tbl (id1, id2, id3, id4, id5, sakumotsu) values (%d, %d, %d, %d, %d, '%s');\r\n", $id[0], $id[1], $id[2], $id[3], $id[4], $item);
      break;
    }
  }
}
$data .= "commit;\r\n";
file_put_contents($sql, $data, LOCK_EX);

if ($lmdate) header("Last-Modified: $lmdate");
if ($etag) header("Etag: $etag");
header('Content-Type: text/plain; charset=Shift_JIS');
echo file_get_contents($sql);
投票数:1 平均点:10.00

投稿ツリー

  条件検索へ