残課題としたもののひとつEXCELへの出力を機能追加しました。
いろいろ改良して、処理速度は結構改善したつもりです。
マシン性能によりますが、僕のPCでは2,000件で約15秒ぐらいの処理時間です。
(EXCEL出力時は8倍程遅いです、同じロジックでその後ACCESS版を作りましたが、そっちは1/2で速いです)
途中経過が表示できないので(処理中はダンマリになる)のが辛いところで
処理件数とか経過時計を表示(ガイド)するようにしたり、
経過音を出すようにしたりしてます。
「市」「町」「村」を区切り判定に使う以上避けられない例外地名への
対応は、そこそこ入れてみました。(勿論不完全です)
堺市の「丁」とか北海道の「条」とか「丁目北」のような「丁目」の例外や
異体字の対応も全然入れてません。出現したら個別対応でしょう。
人間が目で判断するのが速い?とは思うものの
それでも、こうやれば
キレイで簡単なロジックが組めるよというのがありましたら、教えて下さい。
↓以下、ソースはツギハギで作成しているので実にキタナイ。
無職浪人の暇つぶしであります。
どうか、ご容赦を!
**(ADRS_BUNKAI_CSV.hta)*********************************************************
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=Shift_JIS" />
<meta http-equiv="Content-Language" content="ja" />
<meta http-equiv="Content-Style-Type" content="text/css" />
<meta http-equiv="Content-Script-Type" content="text/javascript" />
<hta:application applicationName="ADRS BUNKAI CSV"
navigable="Yes"
contextmenu="Yes"
scroll="Yes">
</hta:application>
<script src="ADRS_BUNKAI_CSV.js" type="text/javascript"></script>
<link href="ADRS_BUNKAI_CSV.ccs" type="text/css" rel="stylesheet">
<title>ADRS BUNKAI CSV</title>
</head>
<body>
<script type="text/javascript"><!--
window.resizeTo(790, 200);
// --></script>
<form name="adrsform">
<table>
<td width="140">住所分解TOOL</td>
<td width="430">▼分解する住所ファイル(CSV)を選択して下さい</td>
<td width="60"><input id="Web" name="OutMedia" type="radio" checked />WEB</td>
<td width="60"><input id="Xls" name="OutMedia" type="radio" />XLS</td>
<td width="60" align="right"><input id="goAnalize" type="button" value="分解" onClick="func_bunkai()"></td>
</tr>
</table>
<table border="1">
<tr>
<td bgcolor="#000000" width="140">住所FILE(CSV)</td>
<td bgcolor="#ffffff"><input type="file" id="inFile" accept=".csv"></td>
</tr>
</table>
<tr><td><label id="labelMsg"></label></td></tr>
</table>
</form>
<bgsound src="C:\Windows\Media\Windows Logon Sound.wav" id=music loop=1 autostart="false">
<script type="text/javascript"><!--
window.resizeTo(790, 200);
// --></script>
</body>
</html>
**(ADRS_BUNKAI_CSV.ccs)*********************************************************
body {
background-color: #3CB371;
color: #ffffff;
filter: progid:DXImageTransform.Microsoft.Gradient
(GradientType="0", StartColorStr="#3CB371", EndColorStr="#C0C0C0");
font-family: "メイリオ";
}
input#inFile {
width:38em;
border:none;
font-family: "メイリオ";
font-size:16px;
ime-mode: active;
}
input#goAnalize {
width:50px;
height:30px;
font-size:14px;
text-decoration:none;
display:block;
text-align:center;
color:#ffffff;
background-color: #000000;
border-radius:5px;
box-shadow:2px 2px #ff0000;
}
**(ADRS_BUNKAI_CSV.js)**********************************************************
// グローバル変数
var kenMei,sikuMei,oazaMei,koazaMei,bantiMei,kataMei,postNo,kenCd,sikuCd,oazaCd,koazaCd,line;
var cn = null;
// 分解メイン ==================================================================
function func_bunkai() {
// 入力ファイル読み込み(初期)******************
var inFile = document.getElementById("inFile").value;
if (inFile=="") {
alert("ファイルを選択して下さい");
document.getElementById("labelMsg").innerText = "ファイルを選択して下さい";
return;
}
var fso = new ActiveXObject("Scripting.FileSystemObject");
var file = fso.OpenTextFile(inFile, 1, false); // 読み取り専用
var csv = file.ReadAll().split(/\r\n|[\r\n]/); // 行数取得
var swXls = document.adrsform.OutMedia[1].checked;
if (csv.length > 99) {
file.Close();
var myTime = Math.ceil(csv.length * 0.006) + 1;
if (swXls) { myTime = myTime * 8; } // EXCEL出力時は、8倍する
if (confirm(csv.length + "行あります。よろしいですか?\n処理に凡そ " + myTime + " 秒程かかります")) {
} else { return; }
}
// 開始処理・変数初期化 *************************
document.getElementById("labelMsg").innerText = "処理実行中です";
var startTime = new Date();
var file = fso.OpenTextFile(inFile, 1, false); // 再読み込み
var fr = ""; // 入力レコード
var tmp = []; // 分割レコード
var i = 0; // 行
var j = 0; // 列
var inAdrs = ""; // 変換元住所
var stAdrs = ""; // 住所ワーク
// ORACLEの接続 *********************************
window.onerror = function () { return true; }
cn = new ActiveXObject("ADODB.Connection");
try {
cn.Open("Driver={Microsoft ODBC for Oracle};CONNECTSTRING=ORCL;UID=TESTUSER;PWD=TESTPWD;");
} catch (e) {
document.getElementById("labelMsg").innerText = "ORACLE との接続に失敗しました";
alert("ORACLE との接続に失敗しました");
return false;
}
window.onerror = function () { return false; }
// 開始処理・出力準備 ***************************
if ( swXls ) {
var excel = new ActiveXObject("Excel.Application");
var book = excel.Workbooks.Add(); // 新規ワークブックを作成
var sheet = book.WorkSheets(1); // シートを取得
} else {
var result = '<body style="filter:progid:DXImageTransform.Microsoft.Gradient(gradientType=0,startColorstr=#4169E1,endColorstr=#C0C0C0)";>';
result += '<table border=1 bgcolor=#ffffff>';
}
// 繰り返し処理 *********************************
while (!file.AtEndOfStream) {
// 明細ワーク初期化
func_initWork();
i = i + 1;
fr = file.ReadLine();
tmp = fr.split(",");
// 先頭行処理
if ( i == 1 ) {
var k = -1;
for(j = 0; j < tmp.length; j++){
if(tmp[j].indexOf("住所") >= 0){ k = j; break; }
}
if ( k== -1 ) {
alert("住所列が判定できません");
file.Close();
return;
}
if ( swXls==false ) {
result += '<tr bgcolor=#FF7F50><td>住所</td><td width=75>POST</td><td>県CD</td><td>市町村CD</td><td>大字CD</td><td>小字</td>';
result += '<td>府県名</td><td>市町村名</td><td>大字名</td><td>小字名</td><td>番地</td><td>方書</td></tr>';
}
// 明細行処理
} else {
// 住所分解
inAdrs = tmp[k];
inAdrs = inAdrs.replace(/^ /, "");
inAdrs = inAdrs.replace(/\s+/g, "");
inAdrs = inAdrs.replace("-", "-");
inAdrs = inAdrs.replace(/[A-Za-z0-9]/g, function(s) {
return String.fromCharCode(s.charCodeAt(0) + 0xFEE0);
});
stAdrs = func_kenMei (inAdrs);
stAdrs = func_sikuMei(stAdrs);
stAdrs = func_azaMei (stAdrs);
stAdrs = func_bankata(stAdrs);
// 結果の書出し
if ( swXls ) {
sheet.Cells(i,1).value = inAdrs;
func_cellsSet(sheet,i);
if (i== Math.floor(i/50) * 50) { document.all.music.src="C:/Windows/Media/Windows Battery Critical.wav"; }
} else {
line = "<tr><td bgcolor=#F0E68C>" + inAdrs + "</td>";
result += func_webPage();
if (i== Math.floor(i/200) * 200) { document.all.music.src="C:/Windows/Media/Windows Battery Critical.wav"; }
}
}
}
// 終了処理 *************************************
file.Close();
cn.Close();
cn = null;
document.getElementById("labelMsg").innerText = "住所分解処理終了!";
// EXCEL 出力処理
if (swXls) {
sheet.Cells(1,1).value = "住所";
sheet.Cells(1,2).value = "POST";
sheet.Cells(1,3).value = "県CD";
sheet.Cells(1,4).value = "市町CD";
sheet.Cells(1,5).value = "大字CD";
sheet.Cells(1,6).value = "小字CD";
sheet.Cells(1,7).value = "都道府県";
sheet.Cells(1,8).value = "市区町村";
sheet.Cells(1,9).value = "大字";
sheet.Cells(1,10).value = "小字";
sheet.Cells(1,11).value = "番地";
sheet.Cells(1,12).value = "方書";
var range = sheet.Range(sheet.Cells(1,1),sheet.Cells(1,12));
range.Font.Bold = true;
range.Font.ColorIndex = 2; // 白
range.Interior.ColorIndex = 32; // 青
range = sheet.Range(sheet.Cells(1,1),sheet.Cells(i,12));
range.Borders.Weight = 2; // 罫線(細線)
range.Borders.LineStyle = 1; // 罫線(実線)
sheet.Columns.AutoFit();
excel.Visible = true;
excel.DisplayAlerts = false; // 既存ファイルがあっても上書き
var myD = new Date();
inFile = inFile.replace("CSV","csv");
var xlsFile = inFile.replace(".csv","_") + myD.getFullYear() + "-"
+ ( "0" + (myD.getMonth()+1)).slice( -2 ) + "-"
+ ( "0" + myD.getDate()).slice( -2) + ".xlsx";
book.SaveAs(xlsFile);
excel.DisplayAlerts = true;
var endTime = new Date();
alert("Excelファイル\n" + xlsFile + "\nを出力しました\n処理経過時間:" + (endTime - startTime) + "ms");
document.getElementById("labelMsg").innerText = xlsFile + "\nを出力しました";
excel.Quit();
excel = null;
document.all.music.src="C:/Windows/Media/Windows Logoff Sound.wav";
// WEBサブページ出力処理
} else {
result += '</table></body>';
window.resizeTo(1200,1000);
document.write('<table><tr><td align="center"><b><font size="4" color="#00ffff">住所分解結果 ' + inFile + ' </font></b></td>');
document.write('<td align="right" width=200><a href="ADRS_BUNKAI_CSV.hta"><font size="3" color="#ffff00">戻る</font></a></td></tr></table>');
// document.write('<td align="right" width=200><a href="#" onclick="window.close(); return false;"><font size="3" color="#ffff00">閉じる</font></a></td></tr></table>');
document.write(result);
var endTime = new Date();
document.write("処理経過時間:" + (endTime - startTime) + "ms");
document.write('<bgsound src="C:/Windows/Media/Windows Logoff Sound.wav" id=music loop=1 autostart="false">');
}
}
// Work初期化 ==================================================================
function func_initWork() {
kenMei =sikuMei =oazaMei =koazaMei =bantiMei =kataMei =postNo =kenCd =sikuCd =oazaCd = koazaCd = "";
}
// Excel明細処理 ===============================================================
function func_cellsSet(sheet,i) {
sheet.Cells(i,2).value = postNo;
sheet.Cells(i,3).value = kenCd;
sheet.Cells(i,4).value = sikuCd;
sheet.Cells(i,5).value = oazaCd;
sheet.Cells(i,6).value = koazaCd;
sheet.Cells(i,7).value = kenMei;
sheet.Cells(i,8).value = sikuMei;
sheet.Cells(i,9).value = oazaMei;
sheet.Cells(i,10).value = koazaMei;
sheet.Cells(i,11).value = "'" + bantiMei;
sheet.Cells(i,12).value = kataMei;
}
// Web明細処理 =================================================================
function func_webPage(inAdrs) {
line += "<td>" + postNo + "</td><td>" + kenCd + "</td><td>" + sikuCd + "</td><td>" + oazaCd;
line += "</td><td>" + koazaCd + "</td><td>" + kenMei + "</td><td>" + sikuMei + "</td><td>" + oazaMei;
line += "</td><td>" + koazaMei + "</td><td>" + bantiMei + "</td><td>" + kataMei + "</td></tr>";
return line;
}
// 都道府県名分解 ==============================================================
function func_kenMei(inAdrs) {
var tmp = [];
if (inAdrs.slice(2,3)=="県" || inAdrs.slice(2,3)=="府" ||
inAdrs.slice(0,3)=="北海道" || inAdrs.slice(0,3)=="東京都" ) {
kenMei = inAdrs.slice(0,3);
} else if (inAdrs.slice(3,4)=="県") {
kenMei = inAdrs.slice(0,4);
} else {
return inAdrs;
}
var mySql = "SELECT NEWKENCD FROM MST_ADRS1 WHERE KENMEI = '" + kenMei + "'";
tmp = func_selSql(mySql);
if (tmp[0] != "NOT FOUND") {
kenCd = tmp[0];
return inAdrs.slice(kenMei.length);
} else {
return inAdrs;
}
}
// 市区町村名分解 ==============================================================
function func_sikuMei(inAdrs) {
// 郡仁木町西町一丁目
var r = 0;
var tmp = [];
if (inAdrs==null) { return inAdrs; }
r = 99;
if (inAdrs.indexOf("市") > -1) {
if (inAdrs.indexOf("区") > 0) {
switch (inAdrs.slice(0, 3)) { // 区のある政令指定都市でない市
case "伊達市":
case "石狩市":
case "八戸市":
case "盛岡市":
case "奥州市":
case "上越市":
case "宇陀市":
case "姫路市": sikuMei = inAdrs.slice(0, 3); break;
default:
if (inAdrs.slice(0, 4) == "南相馬市") {
sikuMei = "南相馬市";
} else {
sikuMei = inAdrs.slice(0,inAdrs.indexOf("区")+1);
}
}
} else {
switch (inAdrs.slice(0, 3)) { // 市で始まる市
case "市原市":
case "市川市": sikuMei = inAdrs.slice(0, 3); break;
default: sikuMei = inAdrs.slice(0,inAdrs.indexOf("市")+1);
}
}
r = sikuMei.length;
}
if (inAdrs.indexOf("区") > 0 && inAdrs.indexOf("区") < r ) { // 東京都
sikuMei = inAdrs.slice(0,inAdrs.indexOf("区")+1);
r = sikuMei.length;
}
if (inAdrs.indexOf("町") > 0 && inAdrs.indexOf("町") < r ) {
sikuMei = inAdrs.slice(0,inAdrs.indexOf("町")+1);
r = sikuMei.length;
sikuMei = sikuMei.slice(inAdrs.indexOf("郡")+1);
}
if (inAdrs.indexOf("村") > 0 && inAdrs.indexOf("村") < r ) {
sikuMei = inAdrs.slice(0,inAdrs.indexOf("村")+1);
r = sikuMei.length;
sikuMei = sikuMei.slice(inAdrs.indexOf("郡")+1);
}
if ( r == 99 ) { return inAdrs; }
if (kenCd != "") {
var mySql = "SELECT NEWSIKUCD FROM MST_ADRS2 WHERE NEWKENCD = " + kenCd + " AND SIKUMEI = '" + sikuMei + "'";
} else {
var mySql = "SELECT NEWSIKUCD FROM MST_ADRS2 WHERE SIKUMEI = '" + sikuMei + "'";
}
tmp = func_selSql(mySql);
if (tmp[0] != "NOT FOUND") {
sikuCd = tmp[0];
} else {
r = func_sikuElse(inAdrs);
}
if (kenCd == "") {
mySql = "SELECT NEWKENCD FROM MST_ADRS2 WHERE SIKUMEI = '" + sikuMei + "'";
tmp = func_selSql(mySql);
if (tmp[0] != "NOT FOUND") {
kenCd = tmp[0];
}
}
if (sikuMei.length < r) { // 郡部町村名を戻す
sikuMei = inAdrs.slice(0,r);
}
return inAdrs.slice(r);
}
// 例外地名 ====================================================================
function func_sikuElse(inAdrs) {
// 例外市区町村名
var tmp = [];
var r = 3;
switch (inAdrs.slice(0,3)) {
case "羽村市":
case "村山市":
case "村上市":
case "大村市":
case "大町市":
case "町田市":
case "田村市":
case "都城市": sikuMei = inAdrs.slice(0,3); break;
case "水沢市":
case "江刺市": sikuMei = "奥州市"; break;
default : r = 4; break;
}
if ( r==4 ) {
switch (inAdrs.slice(0,4)) {
case "四日市市":
case "十日町市":
case "廿日市市":
case "南相馬市":
case "東村山市":;
case "野々市市": sikuMei = inAdrs.slice(0,4); break;
case "鳩ヶ谷市": sikuMei = "川口市"; break;
default : r = 5; break;
}
}
if ( r==5 ) {
switch (inAdrs.slice(0,5)) {
case "武蔵村山市": sikuMei = "武蔵村山市"; break;
default : r = 6; break;
}
}
if ( r==6 ) {
switch (inAdrs.slice(0,6)) {
case "吉野郡下市町":
case "杵島郡大町町":
case "高市郡高取町":
case "佐波郡玉村町":
case "柴田郡村田町":
case "神崎郡市川町":
case "田村郡三春町":
case "田村郡小野町":
case "芳賀郡市貝町":
case "余市郡仁木町":
case "余市郡余市町":
case "宗谷郡猿払村":
case "三宅島三宅村": sikuMei = inAdrs.slice(3,6); break;
case "幡豆郡一色町":
case "幡豆郡吉良町":
case "幡豆郡幡豆町": sikuMei = "西尾市"; break;
case "岩手郡滝沢村": sikuMei = "滝沢市"; break;
case "簸川郡斐川町": sikuMei = "出雲市"; break;
default : r = 7; break;
}
}
if ( r==7 ) {
switch (inAdrs.slice(0,7)) {
case "西村山郡河北町":
case "西村山郡西川町":
case "西村山郡大江町":
case "西村山郡朝日町":
case "中新川郡上市町":
case "東村山郡山辺町":
case "東村山郡中山町": sikuMei = inAdrs.slice(4,7); break;
case "高市郡明日香村":
case "胆沢郡金ケ崎町":
case "余市郡赤井川村": sikuMei = inAdrs.slice(3,7); break;
case "南埼玉郡白岡町": sikuMei = "白岡市"; break;
case "八束郡東出雲町": sikuMei = "松江市"; break;
case "東磐井郡藤沢町": sikuMei = "一関市"; break;
case "下都賀郡岩舟町":
case "上都賀郡西方町": sikuMei = "栃木市"; break;
case "愛知郡長久手町": sikuMei = "長久手市"; break;
case "石川郡野々市町": sikuMei = "野々市市"; break;
case "刈田郡七ケ宿町": sikuMei = "七ヶ宿町"; break;
case "名古屋市中村区": sikuMei = "名古屋市中村区"; break;
default : r = 8; break;
}
}
if ( r==8 ) {
switch (inAdrs.slice(0,8)) {
case "北村山郡大石田町": sikuMei = "大石田町"; break;
case "山武郡大網白里町": sikuMei = "大網白里市"; break;
default : r = 9; break;
}
}
if ( r==9 ) {
if (inAdrs.slice(0,9) == "西八代郡市川三郷町") {
sikuMei = "市川三郷町";
} else {
return 0;
}
}
// 他に、市・区・町・村の出現順・位置により誤分解あれば考慮・追加要
var mySql = "SELECT NEWSIKUCD FROM MST_ADRS2 WHERE SIKUMEI = '" + sikuMei + "'";
tmp = func_selSql(mySql);
if (tmp[0] != "NOT FOUND") {
sikuCd = tmp[0];
} else {
sikuCd = "";
r = 0;
}
return r;
}
// 町字分解 ====================================================================
function func_azaMei(inAdrs) {
var azaMei = "";
var stAdrs = "";
var tmp = [];
var r = inAdrs.search("丁目");
if (r > 0) {
azaMei = inAdrs.slice(0,r+2);
azaMei = func_kanSuji(azaMei);
stAdrs = inAdrs.slice(r+2);
} else {
r = inAdrs.search(/[0-9]/);
if (r > 0) {
azaMei = inAdrs.slice(0,r);
stAdrs = inAdrs.slice(r);
}
}
if ( azaMei=="" ) { return inAdrs; }
if ( kenCd=="" || sikuCd=="" ) {
oazaMei = azaMei;
return stAdrs;
}
var azaMei2 = azaMei.replace("大字","");
azaMei2 = azaMei2.replace("小字","");
var mySql = "SELECT OAZAMEI,DECODE(KOAZAMEI,NULL,' ',KOAZAMEI),NEWOAZACD,NEWKOAZACD,YUBIN" +
" FROM MST_ADRS3 WHERE NEWKENCD = " + kenCd + " AND NEWSIKUCD = " + sikuCd
+ " AND OAZAMEI || KOAZAMEI LIKE '%" + azaMei2 + "'";
tmp = func_selSql(mySql);
if (tmp[0] != "NOT FOUND") {
oazaMei = tmp[0];
} else {
r = inAdrs.search("-");
if (r > 0) {
var azaMei2 = inAdrs.slice(0,r) + "丁目";
azaMei2 = func_kanSuji(azaMei2);
var stAdrs2 = inAdrs.slice(r+1);
var mySql = "SELECT OAZAMEI,DECODE(KOAZAMEI,NULL,' ',KOAZAMEI),NEWOAZACD,NEWKOAZACD,YUBIN" +
" FROM MST_ADRS3 WHERE NEWKENCD = " + kenCd + " AND NEWSIKUCD = " + sikuCd
+ " AND OAZAMEI || KOAZAMEI = '" + azaMei2 + "'";
tmp = func_selSql(mySql);
if (tmp[0] != "NOT FOUND") {
oazaMei = tmp[0];
stAdrs = stAdrs2;
}
}
}
if (tmp[0] == "NOT FOUND") {
oazaMei = azaMei;
koazaMei = "";
oazaCd = "";
koazaCd = "";
postNo = "";
} else {
koazaMei = tmp[1];
oazaCd = tmp[2];
koazaCd = tmp[3];
postNo = tmp[4];
}
return stAdrs;
}
// 番地・方書分割 ==============================================================
function func_bankata(inAdrs) {
var r = inAdrs.search(" ");
if (r > 0) {
bantiMei = inAdrs.slice(0,r);
var stAdrs = inAdrs.slice(r+1);
kataMei = stAdrs;
} else {
bantiMei = inAdrs;
kataMei = "";
}
}
// マスタ検索 ==================================================================
function func_selSql(mySql) {
var arr = [];
try {
var rs = cn.Execute(mySql);
} catch (e) {
document.write("SQLの実行が失敗しました" + "<br>" + mySql + "<br>");
alert("SQLの実行が失敗しました" + "\n" + mySql);
cn.Close
return false;
}
if (!rs.EOF){
for ( var i = 0; i < rs.Fields.Count ; i++ ) {
if (rs(i).value == null) {
arr[i] = ""
} else {
arr[i] = rs(i).value
}
}
} else {
arr[0] = "NOT FOUND"
}
rs.Close();
rs = null;
return arr;
}
// 丁目数字変換(アラビア数字⇒漢数字)=========================================
function func_kanSuji(azaMei) {
var r = azaMei.search(/[0-9]/);
if ( r < 0 ) { return azaMei; }
var a = '1,2,3,4,5,6,7,8,9,一0,一1,一二,一三,一四,二0,二一,二2,二三,二四'.split(',');
var k = '一,二,三,四,五,六,七,八,九,十,十一,十二,十三,十四,二十,二十一,二十二,二十三,二十四'.split(',');
for ( var i = 0; i < 19 ; i++ ) {
azaMei = azaMei.replace(a[i],k[i]);
}
return azaMei;
}
最新の画像もっと見る
最近の「HTA」カテゴリーもっと見る
最近の記事
カテゴリー
- VBScript(2)
- Weblog(314)
- お仕事ツール(0)
- Saloon(1099)
- Node.js他(Python)(16)
- HTA(32)
- 決め・分け論(71)
- 映画・ドラマ(37)
- EXCEL VBA(35)
- PL/SQL(10)
- Java(11)
- 詩(自作)(5)
- 詩(塚原将)(298)
- 短歌(200)
- 題詠100首鑑賞(96)
- 題詠100首(109)
- ALIAS SMITH and JONES エピソード(1)
- 題詠100首2010(11)
- 読書(74)
- プロスポーツ(プロ野球、格闘技)(27)
- 日常・育児とか(88)
- 仕事(IT関係)(61)
- とほほ(33)
- 夢(32)
- 勝手にバトン(7)
- 写真(36)
- スタートレック視聴日誌草稿(24)
- 旅行(25)
- 嫌いな言葉(6)
- 好きな言葉(4)
バックナンバー
人気記事