トピック

プログラマーを苦しめてきた「KEN_ALL.CSV」を「utf_all.csv」に!「EmEditor」を駆使して変換してみた

豊富な機能とJavaScript対応マクロで難物を攻略。表計算ソフトのような編集・集計も

「EmEditor」のCSVモード。表計算ソフトのように表が表示される

 窓の杜で何度も紹介しているように「EmEditor」は、大変高機能なテキストエディターです。ユニーク且つ便利な機能を満載しており、その利点を説明していれば分厚い書籍ができるはず。でも、それを全部読んでいただける余裕のある方は少ないでしょうし、書く方も大変です。

 そこで今回はわかりやすい実例を挙げて「こんなことができてしまうテキストエディター」であることを説明してしまおうと思います。例に挙げるのはあの悪名高きCSVデータ「KEN_ALL.CSV」です!

 最近、やっと扱いやすい形式に更新した「utf_all.csv」がリリースされ、地獄から解放された開発者の方も多いかと思います。しかし、「EmEditor」を使っていれば「utf_all.csv」が存在しない世界でも地獄を見ることなく、「utf_all.csv」のように扱いやすいデータに変換できることを実証して見せます!

CSV編集能力のスゴさも紹介

 なお、utf_all.csvを使う以外場合でも、「EmEditor」のCSV編集能力と巨大ファイル編集能力は、大いに活躍します。CSV編集能力については、『やっぱりスゴいEmEditorの「CSV編集力」、12万行の加工・分析も「なんで?」の軽さ』の章で詳しく解説しているので、ご一読ください。

「EmEditor」ならCSVを表としてサクサク操作

 CSVはわりと古くからあるデータ形式です。特に最近は世の中が紙からデジタルに移り変わるにつれ、銀行やクレジットカードの取引履歴など、さまざまなところでCSVファイルを目にすることが増えたと思います。

 CSVの特徴としては、テキスト形式なので、列と行からなる表形式のデータを扱うのに手軽だということが挙げられます。表形式データとしてはほかに「Excel」のXLSX形式もメジャーですが、CSVファイルなら開くだけであればテキストエディターでも開け、応用が効くのが利点です。

 ただし、CSVを表として扱うとなると、単なるテキストとして開いただけでは不便です。列を揃えて表示したり、列を追加・削除・移動したり、あるいはデータを集計したりといったことができません。これらの機能が必要な場合は「Excel」などの表計算ソフトが使えますが、それでは元の黙阿弥でしょう。

 そこで「EmEditor」の出番です。テキストエディターなので、ファイルをサクッと開いてサクサク操作できます。一方で、CSV形式を自動で検出して表形式で表示してくれ、列単位やセル単位の処理なども、表計算ソフトと同じように可能です。連番を入力するオートフィルの機能や、データを集計するピボットテーブルの機能まで備えています。

 また、「EmEditor」にはもともと、巨大なテキストファイルを必要な一部分だけ読み込む機能もあり、ログファイルのような巨大なデータも高速に処理可能です。もちろん、検索や置換をはじめとする、テキストエディターならではの豊富なテキスト処理機能も使えます。

 なお「EmEditor」はライセンスによって、有償の「EmEditor Professional」と、機能をある程度制限した無償の「EmEditor Free」があります。CSVモードはこのうちProfessional版で使用可能です。

「EmEditor」公式サイト

郵便番号データ「KEN_ALL.CSV」を読み込んで加工

 ここで、改めて「KEN_ALL.CSV」について紹介しましょう。「KEN_ALL.CSV」は日本郵便が公開している郵便番号データで、日本郵便のダウンロードページから誰でもダウンロード可能です。全国版のデータは、本記事の執筆時点で12万4千行(件)ちょっとあります。

日本郵便の郵便番号データダウンロード

 郵便番号データは、古い形式の「KEN_ALL.CSV」と、最近改善された新しい形式の「utf_all.csv」の2種類が用意されています。今回は「読み仮名データの促音・拗音を小書きで表記するもの」のページにある[全国一括]リンクからZIP形式でアーカイブされたKEN_ALL.CSVをダウンロードしました。

「読み仮名データの促音・拗音を小書きで表記するもの」のKEN_ALL.CSVダウンロードリンク

 KEN_ALL.CSVとutf_all.csvでは、次のような違いがあるとのことです。

  • 読み仮名が半角カタカナから全角カタカナになった
  • 文字コードがShift_JISからUTF-8になった
  • 町域名が一定の長さ(全角38文字、半角76文字)より長い場合に複数行に分割されていたのが、1行に収められた

 本記事では、あえて古いKEN_ALL.CSVを読み込んで、utf_all.csv風になるよう自前で処理してみよう、という内容。「現時点での実用性」というよりは、「ああ、ここまでできるんだ!」という実例だと思ってもらえればと思います。

 KEN_ALL.CSVを「EmEditor」で開くと、自動的にCSVモードになってくれます。CSVモードでは「Excel」のように、CSVで表現された各列が列ごとに揃えて表示されます。「Excel」のようにセル単位で選べる状態になり、コピーなどもセル単位で可能です。また、ツールバーの[セル]欄に、現在のセルの内容が表示されます。

KEN_ALL.CSVを「EmEditor」で開いたところ

半角カナ・数字を全角に変換

 ここからutf_all.csvっぽく加工してみましょう。

 まず半角カタカナを全角カタカナにします。KEN_ALL.CSVの読み仮名が記載されている列、具体的には4から6列目を選択します。列番号の部分をドラッグすれば複数の列を一括で選択可能です。

 次に、メニューから[変換]-[半角/全角変換]コマンドを選びましょう。ここで[対象]エリアから[カタカナ]と[カナ記号]、[英数字]のみを選択し、[動作]エリアで[全角に変換]を、[範囲]エリアで[選択範囲のみ]を選択します。これで[OK]ボタンを押せば、地名の読み仮名を半角カタカナから全角カタカナ、半角の数字を全角の数字に変更可能です。

半角カタカナ・数字を全角に変換
カタカナと数字が全角になった

半角括弧を全角括弧に置換

 これで全角・半角問題は解決といいたいところですが、実はutf_all.csvの読み仮名は全角括弧「(」、「)」を使っており、KEN_ALL.CSVでは半角括弧「(」、「)」が使われています。[半角/全角変換]コマンドで変換したいところですが、変換対象に[英数記号]を加えると、区切り文字の引用符「"」まで全角になってしまい、問題があります。

 「(」と「)」を1つずつ置換したり、正規表現を使うなど、いろいろな方法がありますが、今回は簡単、かつ一気に解決する[連続置換]機能を使います。まず、括弧が含まれる6列目を選択しておきましょう。[Ctrl]+[H]キーで[置換]ダイアログを呼び出し、右下端の[連続>>]ボタンを押して[連続置換]ダイアログに切り替えます。

[置換]ダイアログの[連続>>]ボタンを押すと[連続置換]ダイアログに切り替わる

 次に[選択した範囲のみ]オプションをONにし、[検索する文字列]欄に半角の「(」、[置換後の文字列]欄に全角の「(」を入力して[連続へ追加]ボタンを押します。同じように[検索する文字列]欄へ半角の「)」、[置換後の文字列]欄に全角の「)」を入力してまた[連続へ追加]ボタンを押せば準備完了。

 ダイアログ右側のリストに先ほど入力した括弧が掲載され、チェックボタンがONになっていることを確認したら、[すべて連続置換]ボタンを押せば、一括で括弧を全角にすることが可能です。

連続置換を実行する
半角の括弧が一括で全角に置換できた

文字コードをShift_JISからUTF-8に変換

 続いて、この状態でUTF-8に変換しちゃいます。

 メニューから[ファイル]-[名前を付けて保存]で表示される[名前を付けて保存]ダイアログにて、下部の[エンコード]プルダウンリストで[UTF-8(BOM付き)]を選びます。念のため、ファイル名を「KEN_ALL2.CSV」など別名にして保存しておいたほうがいいでしょう。

 なお、実はutf_all.csvのUTF-8エンコードはBOMなしなのですが、「BOM付き」をあえて選んだのは「Excel」で開いても文字化けさせないためです。また、改行コードは[CR+LF]のままにしておきましょう。

「UTF-8(BOM付き)」を指定して別名で保存

複数に分割された行を統合

 さて問題は、KEN_ALL.CSVがプログラマーから忌み嫌われている所以、町域名が長いため複数行に分割されている箇所です。実例を、CSVモードを解除して見てみると、下図のようになっています。

「(」の始まる行から「)」で終わる行まで3行に分割されている

 郵便番号などのデータは同じで、町域名と読み仮名だけが違う行が、複数行(ここでは3行)続いていいます。最初の行には「(」があって「)」がなく、最後の行に対応する「)」があるのが特徴です。

 ざっと数えてみると、このような箇所が200以上あるため、手作業で変換するのは厳しそうです。そこで、JavaScriptによる「EmEditor」マクロスクリプト「kenall_combine.jsee」を以下のように書いてみました。

// 再描画を禁止して高速化
Redraw = false;
// セル選択モードになっていたら、一時的に解除する
bOldCellMode = document.CellMode;
document.CellMode = false;
// 先頭に移動
document.selection.StartOfDocument();
// 開きカッコのみのセル(統合開始行)を検索
while (document.selection.Find("([^\n)]*\"", eeFindNext | eeFindReplaceRegExp)) {
  // 統合開始行の内容を取得
  var baserow = document.selection.GetActivePointY(eePosLogical);
  var basecells = document.GetLine(baserow).split(",");
  // 続く行を1行ずつ取得
  var row = baserow;
  while (true) {
    var cells = document.GetLine(++row).split(",");
    // 同じ郵便番号が続いていれば統合
    if (cells[2] == basecells[2]) {
      basecells[8] += cells[8];
      basecells[5] += cells[5];
      // 町域名に閉じカッコが含まれれば終了
      if (cells[8].indexOf(")") >= 0) {
        break;
      }
    } else {
       break;
    }
  }
  // 一連の行を、統合した内容で置き換え
  document.selection.SetActivePoint(eePosLogical, 1, baserow);
  document.selection.SetActivePoint(eePosLogical, 1, row + 1, true);
  document.selection.Text = basecells.join(",").replace(/""/g, "") + "\r\n";
}
document.CellMode = bOldCellMode;  // セル選択モード設定しなおす

 これを実行すると、「EmEditor」上で分割された行が1つにまとめられます。この結果を「KEN_ALL3.CSV」など別名にして保存しておきましょう。

分割されていた内容が1つにまとめられた

やっぱりスゴいEmEditorの「CSV編集力」12万行の加工・分析も「なんで?」の軽さ

 ではここからは、utf_all.csvっぽく変換したKEN_ALL3.CSVを「EmEditor」のCSVモードで読み込み、CSVならではの操作をしてみましょう。

 ちなみに、ここで解説するCSVの編集操作は、もちろんutf_all.csvをはじめとするどんなCSVファイルでも利用できます。これらの機能以外にもCSVを編集する上で便利な機能を多数備えていますので、使いこなせば作業を大幅に効率化できるでしょう。

一瞬で引用符を削除

 まず、「EmEditor」で読み込んでみます。

 「EmEditor」では、ドラッグ&ドロップでも、メニューの[ファイル]-[開く]からでも、一瞬でサクッと開けます。

 さて、CSVでは各セルを「"」(ダブルクォート)で囲んで記述可能です。「EmEditor」はテキストエディターなので、このダブルクォートをテキスト内容に忠実に表示します。ただし、CSVではセル内に「,」などが含まれなければダブルクォートはなくても構いません。そこでここではダブルクォートを除去してみましょう。

 ダブルクォートの除去は簡単です。メニューから[CSV]-[CSVコンバーター]を選んでウィンドウ右側にCSVコンバーターを表示し、[その他の操作]の中にある[不要な引用符を削除]をクリックするだけです。一瞬で処理されます。

CSVコンバーターの[不要な引用符を削除]でダブルクォートを削除

列の削除が表計算ソフトと同様に可能

 次に、必要な列以外を削除してみましょう。

 郵便番号データファイルには、全国地方公共団体コードや旧郵便番号などの列が含まれています。そこで、そうした列を削って、自分にとって扱いやすくすることが可能です。

 「EmEditor」のCSVモードでは、列の上の列番号の部分をクリックすると列が選択できます。そして同じ場所を右クリックして[列の削除]を選べば、行が削除可能です。

「EmEditor」のCSVモードで列を削除

 ここでは、「EmEditor」で1列目(全国地方公共団体コード)と2列目(旧郵便番号)を削除しました。

列の値で行をフィルタリング

 さらに、列の値で行をフィルタリングしてみましょう。

 KEN_ALL.CSVでは、元データで10列目以降は「1」または「0」の値が入るフラグになっています。たとえば13列目は「一つの郵便番号で二以上の町域を表す場合の表示」となっており、この列が「1」になっている行は該当し、「0」になっている行は該当しません。

 そこで、元13列目、今は2列削除したので11列目の値が「1」の行だけを、フィルターで表示してみます。

 ここではわかりやすいように、あらかじめ1行目にヘッダー行を入れました。そして[フィルター]ツールバーで、先にキーワードボックスの右のドロップダウンリストから11列目の[11: カラム13]を選んで、キーワードボックスに「1」を入力します。すると、Excelと同様に、該当する行だけが表示されます。

 なお、元に戻すには、[フィルター]のツールバーでキーワード入力内容を削除してやればOKです。

「EmEditor」でフィルタリング
「EmEditor」でフィルタリングされたところ

ピボットテーブルも使える

 そして「EmEditor」のCSVモードでは、Excelでのデータ集計でよく使われるピボットテーブルまで使えます。

 ピボットテーブルで数値の集計をとることなどがよくありますが、ここでは件数をカウントしてみましょう。フィルターの例と同様に11列目の「一つの郵便番号で二以上の町域を表す場合」を、都道府県ごとに件数をとってみることにしました。

 先ほど1行目にヘッダー行を追加したので、まずは「ヘディング」を指定します。ツールバーの[ヘディング]をクリックして、メニューから[列ヘディング1]を選ぶと、「EmEditor」上で1行目の背景が黄色くなります。

ヘディングを指定
ヘディングが指定された

 続いて、同じくツールバーの[ピボットテーブル]をクリックすると、ピボットテーブルを設定するダイアログが表示されます。ここでまず[型]プルダウンメニューを[件数]にします。そして、[行]プルダウンメニューを[5: 都道府県名]の都道府県名に、[並べ直し]プルダウンを[(無し)](CSV上の順番どおり)にして、[列の合計]のチェックマークを外しました。

 [列]プルダウンメニューは[11: カラム13]の11列目に、その下の[並べ替え]プルダウンを[AからZへ並べ替え]に、[値]も「11: カラム13」の11列目にして、[列の合計]チェックボックスをOFFにしましょう。

ツールバーの「ピボットテーブル」をクリック
ピボットテーブルを設定

 これで[OK]ボタンを押せば、都道府県ごとに11列目の値が「0」と「1」の件数を表示できます。

「EmEditor」でピボットテーブルが作られた

CSVファイルを開くには「EmEditor」が便利

 以上、CSVファイルを「EmEditor」で開いて編集してみました。紹介したのは一部の機能ですが、思っていた以上に「Excel」などの表計算ソフトに近いことができるという感想を持ちました。

 もちろん、表計算の機能は「Excel」などの表計算ソフトがだんぜん豊富なのですが、そこまでのことをしないケースも多いでしょう。セルに数値を入力した際に冒頭の「0」が消えてしまう問題のように、自動的に複雑なことをせずシンプルにテキストとして扱うほうがいいこともあります。

 しかも、「EmEditor」の特長である、巨大ファイルでもサクッと開いてサクサク編集できる高速さは、CSVファイルでも健在です。

 今回は12万行強のデータでしたが、「EmEditor」はまだまだ巨大なデータを扱えます。たとえば、膨大なログファイルからキーワードで検索したり、列を整理したり、ピボットテーブルで集計したりといったことも可能です。

 もちろん、CSV以外の編集機能も豊富です。Windowsで高機能なテキストエディターを探している人は、まず無料の「EmEditor Free」を試してみるとよいでしょう。そして、そこで気にいってCSVなどの高度な機能を使ってみたくなった人は、ライセンスを購入することで「EmEditor Professional」にアップグレードできます。