MTU lab

法人番号の一括ダウンロードと表へのインポート (2/3)

非互換性について

前編の記事で、国税庁のサイトからダウンロードしてきたデータは「SQL*Loader とインターフェース互換が無い為、直接ロードできない」と述べました。それが具体的には何かを説明する為、弊社と国税庁をサンプルとして取り上げてみます。

弊社は千葉県に所在する法人ですので、法人番号コードはダウンロードしたファイル中の「12_chiba_all_<年月日>.csv」に含まれます。

63178,4040001006757,01,1,2018-04-25,2015-10-05,"株式会社プラムシックス",,301,"千葉県","千葉市中央区","港町12番21号",,12,101,2600831,,,,,,,2015-10-05,1,,,,,"プラムシックス"

また、国税庁は東京都の霞が関に在りますので「13_tokyo_all_<年月日>.csv」に含まれます。

682723,7000012050002,01,1,2018-04-02,2015-10-05,"国税庁",,101,"東京都","千代田区","霞が関3丁目1-1",,13,101,1000013,,,,,,,2015-10-05,1,"National Tax Agency","Tokyo","3-1-1 Kasumigaseki, Chiyoda-ku",,"コクゼイチョウ"

下の表は上記 2 件のサンプルを項目名と対比できるように示したものです。

項番 項目名/名称 プラムシックス 国税庁
7 一連番号 63178 682723
8 法人番号 4040001006757 7000012050002
9 管理区分 01 01
10 訂正区分 1 1
11 更新年月日 2018-04-25 2018-04-02
12 変更年月日 2015-10-05 2015-10-05
13 商号又は名称 “株式会社プラムシックス” “国税庁”
14 商号又は名称イメージID
15 法人種別 301 101
16 国内所在地(都道府県) “千葉県” “東京都”
17 国内所在地(市区町村) “千葉市中央区” “千代田区”
18 国内所在地(丁目番地等) “港町12番21号” “霞が関3丁目1-1”
19 国内所在地イメージID
20 都道府県コード 12 13
21 市区町村コード 101 101
22 郵便番号 2600831 1000013
23 国外所在地
24 国外所在地イメージID
25 登記記録の閉鎖等年月日
26 登記記録の閉鎖等の事由
27 承継先法人番号
28 変更事由の詳細
29 法人番号指定年月日 2015-10-05 2015-10-05
30 最新履歴 1 1
31 商号又は名称(英語表記) “National Tax Agency”
32 国内所在地(都道府県)(英語表記) “Tokyo”
33 国内所在地(市町村丁目番地等)(英語表記) “3-1-1 Kasumigaseki, Chiyoda-ku”
34 国外所在地(英語表記)
35 フリガナ “プラムシックス” “コクゼイチョウ”

SQL*Loader を使う場合、文字列データの表現に二重引用符のような囲み文字を使う事が出来ます。囲み文字を使わないという選択もできますが、データの一部として半角カンマが存在する場合に問題を引き起こしますので一般的には囲み文字で囲みます。一貫して言えるのは2つの表現方法の混在はNG、という事です。

文字列表現の一貫性を保つ為空データ(IS NULL)の表現に2つの囲み文字を連続して使うことに決めた場合、上のサンプルのオレンジ色で示した項目では、この方針に従わない部分が生じます。

SQL*Loader がこのようなデータを見つけた場合、次のようなメッセージをログファイルに残してレコードの取込が拒否されます。

レコードx: 拒否されました。- 表"xxxx",列"xxxx"でエラーが発生しました。
先頭の囲み文字が見つかりません

データ変換仕様

前述の非互換性をオリジナルのCSVデータから取り除き、SQL*Loaderを使ってスマートにインポートできるようにする為、変換プログラム(入手先を前編の記事を参照)には次のような機能が含まれています。

機能 処理内容
囲み文字補完 文字列型、日付型のデータが想定される値をすべて囲み文字で囲む
また、空データを検出したら連続する2つの囲み文字に置き換える
ファイル結合 複数のCSVファイルを一つにまとめる
レコード長フィールド追加 ロード時の性能を高める為、レコード同士の境目を改行で判断するのではなく、レコード先頭の長さで判定出来る様にする

プログラムの生成

それでは C++言語で書かれたソースコード(ファイル名:adaptor.cpp)から、実行形式ファイル(adaptor.exe)をビルドしてみましょう。

  1. CSV 変換プログラムをビルドする為, Microsoft Visual C++ 2013 以降の製品を用意して下さい。もし Visual C++ Community Edition を使うのであれば こちらからダウンロードできます。
  2. Visual Studioの製品メニューに含まれる”Visual Studio コマンドプロンプト”を開き、前の投稿で説明した資源フォルダへカレントディレクトリを変更して下さい。
  3. cd /d 資源フォルダ
  4. プログラムをビルドする為コマンドプロンプトへ次のコマンドを入力して下さい。
  5. nmake EXE="adaptor.exe" OBJS="adaptor.obj" CPPFLAGS="/nologo /EHsc /Zi /O2"
  6. ビルドに成功した場合のメッセージ例を下記に示します。
  7. c:\github\houjin_bangou>nmake EXE="adaptor.exe" OBJS="adaptor.obj" CPPFLAGS="/nologo /EHsc /Zi /O2"
    
    Microsoft(R) Program Maintenance Utility Version 14.00.24210.0
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
            cl /nologo /EHsc /Zi /O2 /c adaptor.cpp
    adaptor.cpp
            cl -Feadaptor.exe adaptor.obj setargv.obj /link /DEBUG /PDB:adaptor.pdb
    Microsoft(R) C/C++ Optimizing Compiler Version 19.00.24215.1 for x86
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    Microsoft (R) Incremental Linker Version 14.00.24215.1
    Copyright (C) Microsoft Corporation.  All rights reserved.
    
    /out:adaptor.exe
    /DEBUG
    /PDB:adaptor.pdb
    adaptor.obj
    setargv.obj
  8. これで準備が整いました。

変換実行

ビルドされた adaptor.exe は一つ以上の引数を取ります。引数には国税庁のサイトからダウンロードした書庫ファイル中に含まれていた CSV ファイルの名前を列挙することができます。ファイル名を直接指定する以外にもワイルドカード文字を使ってファイル名のパターンを指定することもできます。

ファイル名のみを与えられた場合はカレントディレクトリに変換対象のCSVファイルがあるものとみなします。カレントディレクトリ以外の場所にCSVファイルがある場合はその場所を示す相対ディレクトリや絶対ディレクトリのパスを前に置く事が出来ます。

adaptor.exe は引数を省略して実行すると簡単な使用例を示します。下記にその事例を示します。

c:\github\houjin_bangou>adaptor.exe
Usage:
        adaptor <src_file>...
        You can use wildcard characters in part or all of src_file.

引数にファイル名を与えて変換処理を開始するとカレントディレクトリに 00_houjin_bangou.csv という名前のファイルが作られ変換結果が保存されます。複数のオリジナルCSVファイルが指定された場合は、変換された順番にすべてを1つにまとめて 00_houjin_bangou.csv へ保存されます。既に同じ名前のファイルがある場合は警告なく上書きされますのでご注意ください。

それでは実際に変換してみましょう。全件データを変換した時の画面表示を下に示します。完了まで 2,3 分掛かります。

c:\github\houjin_bangou>adaptor *_all_????????.csv
01_hokkaido_all_20180928.csv... 197400 lines.
02_aomori_all_20180928.csv... 34124 lines.
03_iwate_all_20180928.csv... 29990 lines.
04_miyagi_all_20180928.csv... 69864 lines.
05_akita_all_20180928.csv... 27377 lines.
06_yamagata_all_20180928.csv... 30312 lines.
07_fukushima_all_20180928.csv... 64909 lines.
08_ibaraki_all_20180928.csv... 79567 lines.
09_tochigi_all_20180928.csv... 65499 lines.
10_gunma_all_20180928.csv... 66273 lines.
11_saitama_all_20180928.csv... 215259 lines.
12_chiba_all_20180928.csv... 186821 lines.
13_tokyo_all_20180928.csv... 1023774 lines.
14_kanagawa_all_20180928.csv... 300179 lines.
15_niigata_all_20180928.csv... 67781 lines.
16_toyama_all_20180928.csv... 31677 lines.
17_ishikawa_all_20180928.csv... 38029 lines.
18_fukui_all_20180928.csv... 27147 lines.
19_yamanashi_all_20180928.csv... 30288 lines.
20_nagano_all_20180928.csv... 69905 lines.
21_gifu_all_20180928.csv... 62557 lines.
22_shizuoka_all_20180928.csv... 108619 lines.
23_aichi_all_20180928.csv... 230622 lines.
24_mie_all_20180928.csv... 47468 lines.
25_shiga_all_20180928.csv... 35748 lines.
26_kyoto_all_20180928.csv... 91879 lines.
27_osaka_all_20180928.csv... 373681 lines.
28_hyogo_all_20180928.csv... 165988 lines.
29_nara_all_20180928.csv... 33473 lines.
30_wakayama_all_20180928.csv... 26718 lines.
31_tottori_all_20180928.csv... 17533 lines.
32_shimane_all_20180928.csv... 20378 lines.
33_okayama_all_20180928.csv... 62868 lines.
34_hiroshima_all_20180928.csv... 96723 lines.
35_yamaguchi_all_20180928.csv... 37346 lines.
36_tokushima_all_20180928.csv... 27296 lines.
37_kagawa_all_20180928.csv... 34387 lines.
38_ehime_all_20180928.csv... 45984 lines.
39_kochi_all_20180928.csv... 22907 lines.
40_fukuoka_all_20180928.csv... 170037 lines.
41_saga_all_20180928.csv... 20970 lines.
42_nagasaki_all_20180928.csv... 36719 lines.
43_kumamoto_all_20180928.csv... 59571 lines.
44_oita_all_20180928.csv... 41147 lines.
45_miyazaki_all_20180928.csv... 33246 lines.
46_kagoshima_all_20180928.csv... 50279 lines.
47_okinawa_all_20180928.csv... 46977 lines.
99_kokugai_all_20180928.csv... 7079 lines.

Completed successfully. Total: 4664375 lines are comverted.
All conversion results have been consolidated into 00_houjin_bangou.csv

弊社と国税庁のレコードが変換されているかどうかを確認してみます。それぞれの法人番号を検索キーワードとしてサーチした結果を一時的なファイルへ保存します。

findstr "4040001006757 7000012050002" 00_houjin_bangou.csv > temp.txt

一時保存した結果をメモ帳で開くと次のような内容が確認できます。SQL*Loader を使ってロードできるデータ表現へ変換できています。

       25863178,"4040001006757","01","1","2018-04-25","2015-10-05","株式会社プラムシックス","","301","千葉県","千葉市中央区","港町12番21号","","12","101","2600831","","","","","","","2015-10-05","1","","","","","プラムシックス"
       286682723,"7000012050002","01","1","2018-04-02","2015-10-05","国税庁","","101","東京都","千代田区","霞が関3丁目1-1","","13","101","1000013","","","","","","","2015-10-05","1","National Tax Agency","Tokyo","3-1-1 Kasumigaseki, Chiyoda-ku","","コクゼイチョウ"

差分データ変換

ここまでの操作で全件(月次で発表される)データの変換が終わり結果が 00_houjin_bangou.csv で保存されました。引き続き差分(日次で発表される)データの変換に移る前に、00_houjin_bangou.csv が上書きされてしまわないよう名前を変えます。

rename 00_houjin_bangou.csv 00_houjin_bangou_zenken.csv

その後、差分データを変換します。

c:\github\houjin_bangou>adaptor diff_????????.csv
diff_20181003.csv... 4623 lines.
diff_20181004.csv... 5630 lines.
diff_20181005.csv... 4347 lines.
diff_20181009.csv... 4859 lines.
diff_20181010.csv... 5857 lines.

Completed successfully. Total: 25316 lines are comverted.
All conversion results have been consolidated into 00_houjin_bangou.csv

差分データの変換結果についても上書きを回避する為名前を変更します。

rename 00_houjin_bangou.csv 00_houjin_bangou_sabun.csv

まとめ

本編を通じて次の事を確認する事が出来ました。

後編の記事では、Oracle Database に表を作り、変換された CSV データをロードする過程について説明します。

法人番号の一括ダウンロードと表へのインポート (1/3)へ戻る
法人番号の一括ダウンロードと表へのインポート (3/3)へ進む