大量のデータを含むCSV。どうやってレンサバに突っ込む?
2018/07/15
レンタルサーバー上のデータベースに対して、
政府などが公開しているデータのCSVファイルを利用する場合には、
人様のサーバーを借りている以上様々な制約の上で行う必要があります。
実際にインポートを行った事で見えてきたできる事できない事についてご紹介します。
大量のデータを含むCSV。どうやってレンサバに突っ込む?
政府などが公開しているデータのCSVファイルを突っ込んで活用する。
サイト運営者が一度は思い描く構想かもしれません。
ならばと検索してみるものの意外と「実際に突っ込んだ」という実績の記事は少なく、
どうも途中で挫折しているっぽい匂いがしてきます。
前置きはいいからお前はどうやったんだ?と思った方は以下で一連の作業をご紹介してます。
そちらをどうぞ。
レンタルサーバーに大きなCSVをインポートする場合、
phpMyAdminなどではタイムアウトが発生して取り込みが困難な場合が多くあるでしょう。
となるとSSH(許可されている場合)で接続してターミナルで操作する方向性になります。
mysqldumpやmysqlimportを使えば便利なのは間違いないでしょう。
(参考)MySQLでcsvファイルをインポートする – 揮発性のメモ
今回SSHは認められているものの、接続がうまくいかずに棚上げにしてしまい、
それでもCSVは取り込みたい。
SSHを使わずになんとかできないか?と思い立ったのが以下の記事になります。
実際に取り込んだ行数460万超、その使い道プライスレス(∞)。
いえ、目的があって取り込んでいるので、
やっとデータの準備ができたという段階なのですが、
思いのほか苦労したので、似た事やりたい人は地味にいるんだろうなと思い紹介しました。
内容としては「load data LOCAL infile」を使えば、
サーバーの制約の範囲内(XSERVERの例)でPHPからインポートできるという話です。
同じPHPで動いているphpMyAdminでやろうとしたのですが、
どうやら公式にもそれはできないと書かれている感じなので諦めました。
460万レコードの取り込みができれば、大抵の事は怖くなる
今回は460万レコード合計は「47都道府県+1海外のCSV」を順に取り込んだ結果です。
※2018/6/29付けデータで、4,633,737レコード。
その為一括で全部を取り込んだわけではなく、
一番多いレコード数で「東京都:1,018,714」件になります。
この処理ができると分かれば、実際できることは飛躍的に増える事と思います。
「郵便番号データダウンロード – 日本郵便」でも、
書かれている通り「全国一括のデータは12万件ある」との事です。
気分的には、たった戦闘力12万ですか。私は460万ですよ。
と、戦闘力で勝ったフリーザ気分になれます。
たぶんこの「気分」ってのはシステム開発において重要な要素です。
精神論とも言われますが、やる気になれないことは大抵は挫折します。
でもやった事があるものは、次は飛躍的に楽になります。
正に「心の戦闘力」みたいなもので、
ローカル環境のDBに取り込むまでは自分でも結構やりますが、
リモートの先にあるレンタルサーバー上に突っ込むことができれば、
そのデータを活用した二次的なシステムが組めて、ホストすることができるようになる。
当然、重たいデータに対しての処理なんかは、
普通にローカルでやってしまえばいい。
以下の処理は力技で「外字企業名」を抽出していますが、
そんな負荷の重い処理はローカル、抽出した結果をレンタルサーバー上で活用する。
そんな使い分けもできるようになります。
自分の中ではまだやりたい事のスタート地点に立っただけの段階ではありますが、
大きなデータベースを自前でホストして外部結合して使う事ができれば、
WebAPIではできない便利なことができるようになるでしょう。
法人データ460万で何をするのか?
そうですね。
あまりこのデータを実際に取り込んで活用しているという記事は見かけません。
WebAPIがありますので、自前で持とうとは思わない人が多いのだと思います。
今回「法人名」が取得できるサービスのデータを扱っていて、
全角で法人名が与えられています。(付随する情報も)
しかし「キーとなる情報がない」
そういう状況に直面しました。
最初はキー無しでもシステム的にはどうにかなるだろうし、いっか。
とも思ったのですが、
その先でデータの活用をするとなった時に、やっぱり不便だなぁと。
※以下「トヨタ自動車株式会社」は日本一企業として採用した一例です。
例えば「トヨタ自動車株式会社」にしても、
データによっては「トヨタ自動車 株式会社」だったり、
「トヨタ自動車(株)」だったり「トヨタ自動車㈱」だったり・・・。
初期の段階で統一しておきたいよなと。
1180301018771|トヨタ自動車株式会社の情報|国税庁法人番号公表サイト
13桁の「1180301018771」法人番号はキーにしたいよね。
せっかくあるんだから。っていう趣旨で始めた事だったんです。
諦めたくないじゃないですか。
なお、この13桁コードは以下のように定義されています。
法人番号はどのように指定されますか(桁数)。
法人番号は、12桁の基礎番号及びその前に付された1桁の検査用数字(チェックデジット)の数字のみで構成される13桁の番号になります。
例えば、株式会社など、会社法等の規定により設立の登記をした法人(設立登記法人)の法人番号を構成する基礎番号は、法務省から提供を受ける商業登記法に基づく「会社法人等番号(12桁)」となります。
また、設立登記法人以外の団体は、国税庁長官が会社法人等番号(12桁)と重複することのない12桁の基礎番号を定めます。この12桁の基礎番号の前に1桁の検査用数字を付した番号を法人番号として指定することになります。
なお、一度指定された法人番号を変更することはできません。
(注) 検査用数字(チェックデジット)とは、法人番号を電子計算機に入力するときに誤りのないことを確認することを目的として、基礎番号を基礎として財務省令で定める算式により算出される一から九までの整数をいいます。
具体的な計算方法は「チェックデジットの計算」を参照してください。
実際に法人番号と言えば、頭一桁を除いた「12桁」という事になるんですね。
でも、何で頭に付けたんだろう。
一般的には末尾に付けるイメージなんだけど。。。
チェックデジットに対応しない桁数しか持ってないシステムに、
法人番号を格納する場合に1桁落して格納するには、頭を落とす方が楽だからかな。
2018/07/15追記
市区町村コードを調べていて気づきました。
市区町村コード(団体コード)のフォーマットは以下のようになっています。
XX-NNN-C(計6桁)
- XX:都道府県識別部(都道府県コード)
- NNN:団体識別部
- C:チェックディジット(検査数字)
そして、各行政機関に対しても、法人番号が付与されています。
この場合、法人番号は以下のように割り当てられています。
c-000020-nnnnnn(13桁)
- c:チェックディジット(検査数字)
- 000020:行政機関共通のコード
- nnnnnn:市区町村コード:6桁
この場合、頭1桁が、法人番号のチェックディジットになっていますが、
市区町村コードの末尾1桁は既にチェックディジットとして付与された変更のできない数字です。
市区町村コードを1桁左にシフトして、末尾チェックディジットでもいいのでしょうけど、
チェックディジットが2桁並ぶよりも、
頭にチェックディジットを付加した方がスマートという判断かもしれません。
まぁ、おかげ様でそのままでは法人コードをソートしにくいという事になりますけども。
12桁でソートすれば済む話。
ここで、法人コードと市区町村コードが絡んでくるとは思わなかった。
いろいろやってみるもんですね。
本サイトで公開しているツールについては、
十分にテストは行っておりますが個人で作成している為、
潜在的なバグがないとは言い切れません。
その為、ツールを用いた結果については十分検証の上ご利用ください。
当サイトおよび、管理人は如何なる損害もその責を負いません。
当サイト内のコンテンツおよび画像において、
出典・引用の外部著作権者の明記がないものは、
すべて管理人による著作物です。
当サイトでご紹介しておりますコンテンツの著作権の放棄は致しません。
サイト内コンテンツを引用される際にはご連絡は不要です。
ただし、出典元として当サイト(個別記事)へのリンクをお願いいたします。
申し訳ございませんが、無断転載、複製をお断りさせて頂いております。
コンテンツを有益であると感じていただけましたら非常に光栄です。
ありがとうございます。
関連記事
-
CIDRをIPアドレスに展開するのは意外と需要があった。
当初自分は「CIDR」で指定したIP帯に対して、 目的のIPアドレス(自分のグロ …
-
サイトが生まれたきっかけは「キャリアCIDRをまとめたい」だった
サイトを作るにまで至ってしまった本来の目的は、 「携帯各社のグローバルIPアドレ …
-
「CIDR+CIDR結合」ツールのメリットが分かりやすいケースに出会ったのでご紹介
当サイトでは、複数のCIDR形式によるIPアドレス範囲同士を結合し、 より少ない …
-
スーパーネット化された環境のxxx.xxx.xxx.255はホスト割り当てできず問題になったことがあったのか
CIDRやサブネットマスクなどからIPアドレスの範囲を求め、 そのネットワークで …