LoginSignup
2
2

More than 5 years have passed since last update.

KEN_ALL.CSV加工マクロ(EmEditor)

Last updated at Posted at 2019-05-27

機能

KEN_ALL.CSVから、郵便番号と住所(漢字)を抽出したファイルを作成する
出力ファイルはUTF–8、改行コードは未変換(元ファイルのまま)です。

使い方

  1. 日本郵便の郵便番号データダウンロードページで公開されている、"KEN_ALL.CSV"ファイルを開き、EmEditorで下記マクロを実行する。
  2. KEN_ALL.CSVと同じディレクトリにKEN_ALL_cnv.CSVファイルが作成される

マクロ

郵便番号データ変換.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);
//★土樋(1丁目「11を除く」) => 土樋(1丁目)
//★切畑(長尾山「その他」) => 切畑(長尾山)
document.selection.Replace("(\".*(.*)「(.*を除く|その他)」()\")","\\1\\3",eeFindReplaceSelOnly | eeReplaceAll | eeFindReplaceRegExp,0);
//★音江町(国見その他) => 音江町(国見)
document.selection.Replace("(\".*(.*)その他()\")","\\1\\2",eeFindReplaceSelOnly | eeReplaceAll | eeFindReplaceRegExp,0);
//★花田町官有地(無番地を除く)
//★芦田町福田(376-10を除く)
//★津島町下畑地(乙を除く)
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行目は、元のソース上は"\\"です(¥マーク2つを二重引用符でくくっている)コードの色が変になっていますが...
  • EmEditorでのcsvの加工をしようと思い、その時の練習用に作成しました

参考

EmEditor マクロ ヘルプ チュートリアル
とほほのJavaScriptリファレンス:文字列(String)

2
2
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
2