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

環境はWin10 Pro x64 + MSSQL 2016 Express x64 node8.4 x64

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

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

MSSQLのポートの設定はここレッスン 2: 別のコンピューターからの接続

相変わらずMSSQLの設定は メニューの入り方が バラバラだなぁ・・・

まずはSSMSでDBを作成する

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

CREATE TABLE [dbo].[POSTAL](
    [POSTAL]   [nchar](8) NULL,
    [PREF]     [nchar](20) NULL,
    [CITY]     [nchar](40) NULL,
    [ADRLINE1] [nchar](40) NULL,
    [ADRLINE2] [nchar](40) NULL,
    [ADRLINE4] [nchar](40) NULL
) ON [PRIMARY]

環境設定(追加のみ)

PS > npm install tedious-connection-pool
npm WARN nodedb@1.0.0 No description
npm WARN nodedb@1.0.0 No repository field.

\+ tedious-connection-pool@1.0.5
added 10 packages in 13.939sPS >

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

var async = require('async');
var ConnectionPool = require('tedious-connection-pool');
var Request = require('tedious').Request;
var TYPES = require('tedious').TYPES;
var fs = require('fs');
var iconv = require('iconv-lite');
var csv = require('csv');

var connectionConfig = {
    userName: 'demo',
    password: 'passwd',
    server: 'localhost',
    options: {
        database: 'demo'
    }
};

var poolConfig = {
    min: 5,
    max: 10,
    log: false
}

var pool = new ConnectionPool(poolConfig, connectionConfig);

pool.on('error', function(err) {
    console.error(err);
});

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

async.forEachSeries( fs.readFileSync('17ISHIKA.CSV', 'binary').toString().split('\n'), function (line, cb) {
    line = iconv.decode(line, 'Shift_JIS'); //iconv-liteでShift-jisからutf8に変換
    if (line.length > 0) {
        csv.parse(line, function(err, line){
            csv.transform(line, function(line){
                return line;
            }, function(err, line){
                pool.acquire(function (err, connection) {
                    if (err) {
                        console.error(err);
                        return;
                    }
                    //console.log(line[2], " " + line[7], " " + line[8]);
                    request = new Request("INSERT INTO POSTAL (POSTAL, CITY, ADRLINE1) VALUES (@POSTAL, @CITY, @ADRLINE1);", function(err) {
                        if (err) {
                            console.log(err);
                        }
                        connection.release();
                        cb();
                    });
                    request.addParameter('POSTAL',   TYPES.NVarChar, line[2]);
                    request.addParameter('CITY',     TYPES.NVarChar, line[7]);
                    request.addParameter('ADRLINE1', TYPES.NVarChar, line[8]);
                    connection.execSql(request);
                });
            });
        });
    } else {
        console.log('END');
        pool.drain();
        process.exit(0);
    }
}, function(err) {
    console.log('fin');
    pool.drain();
    process.exit(0);
});


select count(*) from postal -> 2552