Re: 分類付き m_sakumotsu
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
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);
投票数:3
平均点:6.67
投稿ツリー
-
分類付き m_sakumotsu (OhYeah!, 2010.11.19 02:11)
-
Re: 分類付き m_sakumotsu (OhYeah!, 2010.11.24 00:45)
-
Re: 分類付き m_sakumotsu (OhYeah!, 2010.11.24 01:13)
-
Re: 分類付き m_sakumotsu (OhYeah!, 2010.11.26 16:19)
-
分類付き m_sakumotsu ほぼ最終仕様 (OhYeah!, 2010.11.29 01:32)
-
Re: 分類付き m_sakumotsu ほぼ最終仕様 (OhYeah!, 2010.11.29 11:03)
-
Re: 分類付き m_sakumotsu ほぼ最終仕様 (OhYeah!, 2010.11.29 12:04)
-
-
分類付き m_sakumotsu 限りなく最終仕様 (OhYeah!, 2010.12.01 01:15)
-
分類付き m_sakumotsu 確定仕様版 (OhYeah!, 2010.12.01 23:02)
-
Re: 分類付き m_sakumotsu 確定仕様版 (sugak, 2010.12.02 13:16)
-
Re: 分類付き m_sakumotsu 確定仕様版 (OhYeah!, 2010.12.02 21:48)
-
-
分類付き m_sakumotsu 修正確定仕様版 (OhYeah!, 2010.12.03 19:27)
-
分類付き m_sakumotsu 最終版? (OhYeah!, 2010.12.06 00:22)
-
Re: 分類付き m_sakumotsu 最終版? (OhYeah!, 2010.12.06 09:59)
-
Re: 分類付き m_sakumotsu 最終版? (OhYeah!, 2010.12.20 22:54)
-
Re: 分類付き m_sakumotsu 最終版? (OhYeah!, 2011.01.23 23:12)
-
-
-
-
-
-
-
-
-
ジベレリン協和粉末は「ひのき科(採種樹)」が正しかった (OhYeah!, 2010.11.29 16:08)
-
作物の上位・下位概念が更新されました (OhYeah!, 2010.11.30 22:33)
-
「きいちご」の分類 (OhYeah!, 2010.12.02 10:04)
-
-
-
-
-
なばな類の分類がおかしくないですか? (OhYeah!, 2010.11.24 21:25)
-