データインポートSQL実行文(load data LOCAL infile)・法人の基本3情報のデータ(法人番号)
テーブルの作成とCSVデータのダウンロードが済んでしまえば、
後はCSVをデータベースにインポートするだけで作業は完了です。
ここでは「load data LOCAL infile」を利用して、
実際に「法人の基本3情報のデータ(法人番号)」を取り込みます。
目次
load data LOCAL infile データインポート実行文
以下PHPにてCSVデータをレンタルサーバー上へアップロードして実際にインポートを行っています。
「hogehoge.php」などで作成しWebアクセスして実行すればインポートできます。
※最初の6行目までは各自のサーバー環境に合せて変更ください。
※「gov_nta_corpnum_{$enc}」にて末尾にエンコードが付与されたテーブル名としています。
これは、以下で作成するSQLのテーブル名に合せています。
※既にレコードがある場合は挿入に失敗しますので、適宜削除後の再実行をお願いします。
末尾のechoは確認終了後、コメントアウトでもしてください。
※エンコード指定は9行目で行っています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 |
<?php $db = 'db'; $host = 'host'; $user = 'user'; $pass = 'pass'; $dir = "/dev/ntagojp_unicode/"; //csvをアップロードしたディレクトリ $con = new mysqli($host, $user, $pass, $db); $enc = 'utf8mb4'; //sjis, cp932などエンコードを指定 $con->query(" set character_set_connection = {$enc};"); $con->query(" set character_set_server = {$enc};"); $con->query(" set character_set_database = {$enc};"); $con->query(" set character_set_client = {$enc};"); $con->query(" set character_set_results = {$enc};"); $data_date = date("Ymd"); $data_date = "20180629"; //適宜上書きで日付指定 $pref = array( 0 => array('01', "hokkaido")); //47都道府県+海外データを適宜指定 $filename = "{$pref[0][0]}_{$pref[0][1]}_all_{$data_date}.csv"; //ヒアドキュメント構文は無用な\nが挿入されここでは使用しない。 $sql = " load data LOCAL infile '{$_SERVER['DOCUMENT_ROOT']}{$dir}{$filename}' into table gov_nta_corpnum_{$enc} FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '\"' ESCAPED BY '' "; $sql .= " LINES STARTING BY '' TERMINATED BY ". "'\\n'" . " IGNORE 0 LINES "; $sql .= " (sequenceNumber, corporateNumber, process, correct, updateDate, changeDate, name, nameImageId, kind, prefectureName,cityName, streetNumber, addressImageId, prefectureCode, cityCode, postCode, addressOutside, addressOutsideImageId,closeDate, closeCause, successorCorporateNumber, changeCause, assignmentDate, latest, enName, enPrefectureName, enCityName, enAddressOutside, furigana);"; $msql_result = $con->query($sql); if( $msql_result === false ){ $msg = "SQLの実行に失敗しました"; }else{ $msg = "インポート終了"; } $cnt_sql = "SELECT prefectureName, count(prefectureCode) FROM gov_nta_corpnum_utf8mb4 GROUP BY prefectureCode;"; $cntresult = $con->query($cnt_sql); if($cntresult->num_rows > 0){ while ($row = $cntresult->fetch_assoc()) { $arr[] = $row; } }else{ $arr = false; } echo $msg . '<br/>' .print_r($arr, true ) . '<br/><code>' . $sql . '</code>' ; |
それぞれのエンコードで取り込んだ実ファイルは以下になります。
sjis、cp932:Index of /dev/ntagojp_sjis
Unicode:Index of /dev/ntagojp_unicode
インポート実行後の表示
作成したphpファイルにWebでアクセスすればそのままインポートが実行され、
正しく実行できたかの参考情報を表示しています。
インポート後にWeb画面にechoにて出力した内容(一部改変)は以下のように表示されます。
実際に定時に自動実行しデータ鮮度を確保する場合などはcronなどを利用される事でしょう。
その場合、$_SERVER['DOCUMENT_ROOT']
は利用できませんので、
適宜、サーバー環境に合せた値に書き換えをお願いします。
sjis
「インポート終了」の文字はPHPのデフォルトエンコードUTF-8による出力に対して、
MySQLに格納されている「北海道」文字は「Shift-jis」出力の為、
どちらかが化けます。
1 2 3 |
繧、繝ウ繝昴�繝育オゆコ� Array ( [0] => Array ( [prefectureName] => 北海道 [count(prefectureCode)] => 196419 ) ) load data LOCAL infile '(サーバーパス)/dev/ntagojp_sjis/01_hokkaido_all_20180629.csv' into table gov_nta_corpnum_sjis FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '' LINES STARTING BY '' TERMINATED BY '\n' IGNORE 0 LINES (sequenceNumber, corporateNumber, process, correct, updateDate, changeDate, name, nameImageId, kind, prefectureName,cityName, streetNumber, addressImageId, prefectureCode, cityCode, postCode, addressOutside, addressOutsideImageId,closeDate, closeCause, successorCorporateNumber, changeCause, assignmentDate, latest, enName, enPrefectureName, enCityName, enAddressOutside, furigana); |
cp932
「インポート終了」の文字はPHPのデフォルトエンコードUTF-8による出力に対して、
MySQLに格納されている「北海道」文字は「cp932」出力の為、
どちらかが化けます。
1 2 3 |
繧、繝ウ繝昴�繝育オゆコ� Array ( [0] => Array ( [prefectureName] => 北海道 [count(prefectureCode)] => 196419 ) ) load data LOCAL infile '(サーバーパス)/dev/ntagojp_sjis/01_hokkaido_all_20180629.csv' into table gov_nta_corpnum_cp932 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '' LINES STARTING BY '' TERMINATED BY '\n' IGNORE 0 LINES (sequenceNumber, corporateNumber, process, correct, updateDate, changeDate, name, nameImageId, kind, prefectureName,cityName, streetNumber, addressImageId, prefectureCode, cityCode, postCode, addressOutside, addressOutsideImageId,closeDate, closeCause, successorCorporateNumber, changeCause, assignmentDate, latest, enName, enPrefectureName, enCityName, enAddressOutside, furigana); |
utf8mb4
「インポート終了」の文字はPHPのデフォルトエンコードUTF-8による出力に対して、
MySQLに格納されている「北海道」文字は「utf8mb4」出力の為、双方表示がそのままで可能
1 2 3 |
インポート終了 Array ( [0] => Array ( [prefectureName] => 北海道 [count(prefectureCode)] => 196419 ) ) load data LOCAL infile '(サーバーパス)/dev/ntagojp_unicode/01_hokkaido_all_20180629.csv' into table gov_nta_corpnum_utf8mb4 FIELDS TERMINATED BY ',' OPTIONALLY ENCLOSED BY '"' ESCAPED BY '' LINES STARTING BY '' TERMINATED BY '\n' IGNORE 0 LINES (sequenceNumber, corporateNumber, process, correct, updateDate, changeDate, name, nameImageId, kind, prefectureName,cityName, streetNumber, addressImageId, prefectureCode, cityCode, postCode, addressOutside, addressOutsideImageId,closeDate, closeCause, successorCorporateNumber, changeCause, assignmentDate, latest, enName, enPrefectureName, enCityName, enAddressOutside, furigana); |
特にエラーなく実行が行えれば、インポート処理は終了です。
ブラウザ表示上の文字化けは、エンコード変更で対応(確認)
それぞれのウィンドウの表示は以下のようになっています。
sjisとcp932はブラウザ表示上は、法人名が文字化けしています。
上記はChromeで表示の確認を行っていますが、
機能拡張をインストールすることで、一時的にエンコードを変更する事ができます。
テキストエンコーディング機能拡張ではブラウザの表示エリア内で右クリックして、
表示されるプルダウンメニューからエンコードの選択ができます。
試しにShift-JISに変更を行うと、法人名は正しく表示できていることが分かります。
代わりにPHPメッセージがUTF-8なので化けますけども。
これでデータの格納は正常なことは確認が行えます。
データのインポートが行えたら、PHPからデータを取得して、
Web表示が行えるかの確認を行います。
外字を中心に・・・。
そもそも「load data LOCAL infile」の「LOCAL」って何?
今回、レンタルサーバー上にCSVファイルをアップロードして、
レンタルサーバー上のPHPファイルをWebブラウザで表示して、インポートを実行しました。
「load data LOCAL infile…」というSQLを発行してインポートしていますが、
この場合、そもそもLOCALって何?という疑問はあるかもしれません。
その点については以下でご紹介してます。
参考
当初、以下を参考にさせて頂いて、このアプローチを試し始めました。
タイトルに「[xserver]」と入っているので、
実際にXSERVERへの取り込みを行ったのかと思って期待しましたが、
ローカル(C:\…)ではXSERVERは無理なはずなので、ちょっと惜しかった。
とにかく、いい「気づき」を与えてくださいました。
[xserver][MySQL]csvファイルからのデータのインポート: PHPを使ったWebサイト構築 備忘録
ちゃんとやりきったよ!サンクス!
本サイトで公開しているツールについては、
十分にテストは行っておりますが個人で作成している為、
潜在的なバグがないとは言い切れません。
その為、ツールを用いた結果については十分検証の上ご利用ください。
当サイトおよび、管理人は如何なる損害もその責を負いません。
当サイト内のコンテンツおよび画像において、
出典・引用の外部著作権者の明記がないものは、
すべて管理人による著作物です。
当サイトでご紹介しておりますコンテンツの著作権の放棄は致しません。
サイト内コンテンツを引用される際にはご連絡は不要です。
ただし、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
公開日:
最終更新日:2019/06/20