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

環境はWin10 Pro x64 + MSSQL 2016 Express x64 node8.4 x64
ありがちなんだけど 郵便番号のCSVデータを nodejsを使って登録してみる(手抜きですが)
データのダウンロードはこちら 郵便番号検索
MSSQLのポートの設定はここレッスン 2: 別のコンピューターからの接続
修正版はこちら
Win10 + node.js から SQL Server 2019 Express に CSVファイルを書き込んでみる(tedious)
Win10 + node.js から SQL Server 2019 Express に CSVファイルを書き込んでみる 修正版(tedious-connection-pool)
相変わらず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