KEN_ALL.CSV加工マクロ(EmEditor)

## 機能
KEN_ALL.CSVから、郵便番号と住所(漢字)を抽出したファイルを作成する
出力ファイルはUTF–8、改行コードは未変換(元ファイルのまま)です。
## 使い方
1. 日本郵便の郵便番号データダウンロードページで公開されている、"KEN_ALL.CSV"ファイルを開き、EmEditorで下記マクロを実行する。
2. KEN_ALL.CSVと同じディレクトリにKEN_ALL_cnv.CSVファイルが作成される

## マクロ

```javascript:郵便番号データ変換.jsee
var startTime = new Date();
/*
□マクロ名：郵便番号データ変換.jsee
□バージョン：1.10
■開くファイル
　郵便番号データダウンロードから取得した住所の郵便番号（CSV形式）
　http://www.post.japanpost.jp/zipcode/download.html
■作成ファイル
　9.町域名の内容を簡略化したファイル（ファイル名=拡張子の前に"_cnv"を追加）
■手順(例)
　KEN_ALL.CSVを開く
　郵便番号データ変換.jseeを実行
　同一ディレクトリに変換後のファイル(UTF-8)が作成される
*/

Redraw = false;//ウィンドウの再描画:しない

document.CellMode = false;//CSV セル選択モード解除

columnN = document.GetColumns();//CSV モードで列の数を取得
if(columnN != 15){
	alert( "列数エラー。列数は、" + columnN + "です。" );
	Quit();
}

//■使用しない列を削除
document.selection.StartOfDocument()//カーソル位置を文頭へ移動
editor.ExecuteCommandByID(3962);//列の削除 1
editor.ExecuteCommandByID(3962);//列の削除 1
editor.ExecuteCommandByID(4490);//郵便番号（7桁）
editor.ExecuteCommandByID(3962);//列の削除 1
editor.ExecuteCommandByID(3962);//列の削除 1
editor.ExecuteCommandByID(3962);//列の削除 1
editor.ExecuteCommandByID(4490);//都道府県名
editor.ExecuteCommandByID(4490);//市区町村名
editor.ExecuteCommandByID(4490);//町域名
editor.ExecuteCommandByID(3962);//列の削除 1
editor.ExecuteCommandByID(3962);//列の削除 1
editor.ExecuteCommandByID(3962);//列の削除 1
editor.ExecuteCommandByID(3962);//列の削除 1
editor.ExecuteCommandByID(3962);//列の削除 1
editor.ExecuteCommandByID(3962);//列の削除 1

//■保存するファイル名を設定
strPath = document.Path;//文書のパスを取得
aName = document.Name.split(".");//文書のファイル名を取得
sCnvPath_Name = strPath + "\\" + aName[0] + "_cnv." + aName[1];

//■UTF8で一旦保存
document.Encoding = eeEncodingUTF8;//保存時のエンコード：UTF-8
document.UnicodeSignature = false;//保存時に(BOM)を付けない
document.Save( sCnvPath_Name );//文書を保存
document.close();//文書を閉じる
editor.ExecuteCommandByID(4583);//最も最近閉じたファイルを開く
document.CellMode = false;//CSV セル選択モード解除

//■町域の複数行に渡るかっこ書きを削除
//郵便番号の列を取得
document.selection.SetActivePoint( eePosCellLogical, 1, 1 );
editor.ExecuteCommandByID(4461);
sTmp = "\r\n" + document.selection.Text;
aPostalCode = new Array();
aPostalCode = sTmp.split("\r\n");

//町域の列を取得
document.selection.SetActivePoint( eePosCellLogical, 4, 1 );
editor.ExecuteCommandByID(4461);
sTmp = "\r\n" + document.selection.Text;
aTyou = new Array();
aTyou = sTmp.split("\r\n");
sTmp = null;

//最終行から開始行へ向かって処理を行う
fOkikae = false;//フラグ置き換えモード：終わり
re1 = new RegExp("^\"[^（]*）\"$");//"）"のみを検索
re2 = new RegExp("(^\".*)（[^）]*(\")$");//"（"のみを検索
for(i = aTyou.length - 2; i >= 1; i--){
	if( ( aPostalCode[i] == aPostalCode[i-1] ) || ( fOkikae == 1)){//郵便番号が同じor置き換えモードの場合
		document.selection.SetActivePoint( eePosCellLogical, 4, i );
		if( fOkikae ){
			if(aTyou[i].match(re2)){//"（"のみを検索
				document.SetCell( i , 4, RegExp.$1 + RegExp.$2, eeDontQuote );
				fOkikae = false;//フラグ置き換えモード：終わり
			}else{
				document.selection.SelectLine();
				document.selection.Delete(1);//行削除
			}
		} else {
			if(aTyou[i].match(re1)){//"）"のみを検索
				document.selection.SelectLine();
				document.selection.Delete(1);//行削除
				fOkikae = true;//フラグ置き換えモード：開始
			}
		}
	}
}

//■町域の文字列を置き換え
document.selection.SetActivePoint( eePosCellLogical, 4, 1 );//カーソル位置を設定
editor.ExecuteCommandByID(4461);//列を選択
document.selection.Replace("以下に掲載がない場合","",eeFindReplaceSelOnly | eeReplaceAll,0);
document.selection.Replace("(\".*)（(その他|丁目|番地|次のビルを除く|地階・階層不明|.*[、～].*|.*以上|.*以下)）(\")","\\1\\3",eeFindReplaceSelOnly | eeReplaceAll | eeFindReplaceRegExp,0);
//★名駅ミッドランドスクエア（高層棟）（地階・階層不明）
document.selection.Replace("(\".*)（高層棟）(.*\")","\\1\\2",eeFindReplaceSelOnly | eeReplaceAll | eeFindReplaceRegExp,0);
//★三田市の次に番地がくる場合
document.selection.Replace("\".*の次に番地がくる場合\"","\"\"",eeFindReplaceSelOnly | eeReplaceAll | eeFindReplaceRegExp,0);
//★土樋（１丁目「１１を除く」） => 土樋（１丁目）
//★切畑（長尾山「その他」） => 切畑（長尾山）
document.selection.Replace("(\".*（.*)「(.*を除く|その他)」(）\")","\\1\\3",eeFindReplaceSelOnly | eeReplaceAll | eeFindReplaceRegExp,0);
//★音江町（国見その他） => 音江町（国見）
document.selection.Replace("(\".*（.*)その他(）\")","\\1\\2",eeFindReplaceSelOnly | eeReplaceAll | eeFindReplaceRegExp,0);
//★花田町官有地（無番地を除く）
//★芦田町福田（３７６－１０を除く）
//★津島町下畑地（乙を除く）
document.selection.Replace("(\".*)（.*を除く）(\")","\\1\\2",eeFindReplaceSelOnly | eeReplaceAll | eeFindReplaceRegExp,0);

//■町域のかっこ"（"および"）"を削除
document.selection.Replace("(\".*)（(.*)）(\")","\\1\\2\\3",eeFindReplaceSelOnly | eeReplaceAll | eeFindReplaceRegExp,0);

editor.ExecuteCommandByID(4099);//ファイルを上書き保存
document.close();//文書を閉じる
var endTime = new Date();

alert((endTime - startTime)/1000 + "sec");
Redraw = true;//ウィンドウの再描画:する
Quit();
```
## 補足
- UTF-8への変換(内部処理は既にUnicodeですので、正確にはUTF-8での書き出し)は処理の最後にやっても良いです（上記サンプルでは、一旦UTF-8で保存していますが、サンプルと言うことで...）
- 47行目は、元のソース上は"\\\"です(￥マーク２つを二重引用符でくくっている)コードの色が変になっていますが...
- EmEditorでのcsvの加工をしようと思い、その時の練習用に作成しました

## 参考
[EmEditor マクロ ヘルプ チュートリアル](http://www.emeditor.org/ja/macro_tutorial_index.html)
[とほほのJavaScriptリファレンス：文字列（String）](http://www.tohoho-web.com/js/string.htm)