郵便番号のCSVデータを nodejsを使って適当にmysqlに登録してみる

ありがちなんだけど 郵便番号のCSVデータを nodejsを使って登録してみる(手抜きですが)

データのダウンロードはこちら 郵便番号検索

コマンドは以下を参照

MySQLに接続するユーザー名とパスワードの指定

データベースの作成

まずはDBを作成する

A5Mk2にて root - mysql を指定して接続
CREATE DATABASE DEMO;

とりあえず試してみるだけなので、テーブルも手抜き(笑

A5Mk2にて root - demo を指定して接続
CREATE TABLE POSTAL (
  POSTAL   char(8)  CHARACTER SET utf8 DEFAULT NULL,
  PREF     char(20) CHARACTER SET utf8 DEFAULT NULL,
  CITY     char(40) CHARACTER SET utf8 DEFAULT NULL,
  ADRLINE1 char(40) CHARACTER SET utf8 DEFAULT NULL,
  ADRLINE2 char(40) CHARACTER SET utf8 DEFAULT NULL,
  ADRLINE4 char(40) CHARACTER SET utf8 DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4

環境設定(追加のみ)

PS > npm install mysql
npm WARN nodedb@1.0.0 No description
npm WARN nodedb@1.0.0 No repository field.

\+ mysql@2.14.1
PS >

地元県だと名前感あるので 17ISHIKA.CSV を使う

var async = require('async');
var csv   = require('csv');
var fs    = require('fs');
var iconv = require('iconv-lite');
var mysql = require('mysql');

var pool  = mysql.createPool({
  connectionLimit : 10,
  host     : 'localhost',
  user     : 'root',
  password : 'passwd',
  database : 'demo'
});

// https://github.com/ashtuchkin/iconv-lite/wiki/Use-Buffers-when-decoding
iconv.skipDecodeWarning = true;

//pool.on('acquire', function (con) {
//  console.log('Connection %d acquired', con.threadId);
//});

// http://www.codexpedia.com/javascript/nodejs-mysql-pool-connection/
async.forEachSeries( fs.readFileSync('17ISHIKA.CSV', 'binary').toString().split('\n'), function (line, cb) {
    line = iconv.decode(line, 'Shift_JIS');   // Shift_JIS -> utf8
    if (line.length > 0) {
        csv.parse(line, function(err, line){
            csv.transform(line, function(line){
                //console.log(line[2] + line[7] + line[8]);
                return line;
            }, function(err, line){
                pool.getConnection(function(err, con) {
                    if (err) {
                        console.error('error connecting: ' + err.stack);
                        return;
                    }
                    var sql = "insert into postal (postal, city, adrline1 ) values ('"+line[0][2]+"','"+line[0][7]+"','"+line[0][8]+"');"
                    //console.log( "insert:" +  sql);
                    con.query(sql, function (err, result) {
                        if (err) {
                            console.log("err:" +  sql);
                        }
                        con.release();
                        cb();
                    });
                });
            });
        });
    } else {
        console.log('END: ');
        process.exit(0);
    }
});

select count(*) from postal -> 2552