ラベル bcp の投稿を表示しています。 すべての投稿を表示
ラベル bcp の投稿を表示しています。 すべての投稿を表示

2015/06/09

WindowsServer2012で外部サーバとssh同期とSQLサーバのコマンド処理(CSV書出し)


目的
WEBサイト内の一部のコンテンツを非同期処理を行いたいが、
今回、ベンダが用意したOSがWindowsServer2012であったので、
sshや、コマンド処理等、
WindowsServer2012単体で解決出来ない点を
忘れないようにオボエガキしておく。

仕掛け
SQLServer2014の動いているWindowsServer2012マシンで「タスク処理」させる
 ⇒batファイルをつくる
SQLServerをコマンドラインで動かし、必要なカラムを抽出させるクエリをcsvで吐出し
 ⇒bcpコマンドを使う
吐き出したcsvをutf-8に変換する。
 ⇒色々試したが、結果nkfを使うことにした。
レンタルサーバの所定フォルダとwindowsServer2012の所定フォルダの同期をとる
 ⇒ssh接続の方法を単独で持たないようなので、winSCPを利用する。
同期をとったcsvをjQueryを使って整形し、表示させる。


csv書出し用バッチ処理

@echo off
bcp "select ~" queryout "C:\出力先フォルダ\list.csv" -c -t, -S
<192.168.0.xxx> -U <ユーザ名> -P <パスワード>
exit

解説:-c 文字データ型を使用して操作を実行 -t, のカンマ区切りを付与
   -S サーバ名 
   -U ユーザ名
   -P パスワード
※当初、utf-8で出力できないかいろいろ試したが、SQLServerは動作保障外というだけあって、

-C 65001 を付けると書き出さなかった・・・。



エンコード用バッチ処理
 
@echo off
cd C:\作業フォルダ
type top.csv list.csv > before.csv
nkf32.exe -w80 before.csv > listUTF8.csv

解説:bcpコマンドは表題行を書き出してくれないので、
   予め、表題行のcsvを作っておき、typeコマンドでくっつけている。
   今回は、top.csvにlist.csvをくっつけて、
   nkf32.exe -w80 でutf-8に変換している。



レンタルサーバへの同期用バッチ処理


@echo off
cd "C:\Program Files (x86)\WinSCP"
WinSCP.exe /console /script="sync"

exit

解説:WinSCP.exe /console /script="スクリプト処理ファイル"
   この一行で、コマンドで動かせる。
   ITmediaさんに解説ページがあった。
   (コマンドリファレンスへのリンクもあり非常に助かった。)


スクリプト処理ファイルの中身


option batch on
open ユーザ名@サーバ名
cd /var/www/html/サーバ側の所定のフォルダ
lcd C:\ローカル側の所定のフォルダ
synchronize remote
exit

解説:synchronize remote リモート側(サーバ側)を同期させる と書くようだ。
   サーバ側のデータを同期させたいのであれば、synchronize local となる。
   両方ならばそのままの、both。
   事前に接続をさせておき、その際、ini等にパスワードは覚えさせておく必要あり。

非同期処理のhtml


<html>
<header>
<script src=\"jquery-1.11.3.min.js\"></script>
<script src=\"jquery.csv2table-0.02-b-2.8.js\" type=\"text/javascript\" charset=\"utf-8\"></script>
</header>
<body>
<div id=\"view\"></div>
<script>
$(function(){
  $(\'#view\').csv2table(\'./listUTF8.csv\');
});
</script>
<script>location.reload()</script>
</body>
</html>
最小の構成はこんな感じ

解説:jquery-1.11.3.min.js
   jquery.csv2table-0.02-b-2.8.js はそれぞれ先駆者のものを利用させて頂いた。
   jquery.csv2table-0.02-b-2.8.js はutf-8でないと文字化けする。

   mimeをかぶせてshift-jisという方法もあるが、
   一発で上手くいかなかったことととブラウザに左右されそうだったので、nkfでの処理を選択した。


WinSCP補足

ツール→環境設定→保存→レジストリからINIファイルに変更
ツール→設定のエクスポート

↓おまじない
◆WinSCPの起動をini起動にする
"C:\Program Files (x86)\WinSCP\WinSCP.exe" /ini=C:\syncXML\WinSCP.ini
winwcp.ini 設定
◆同期のコマンドの変数を2に変える
SynchronizeParams=2にする
◆winSCP.iniは出来れば、WinSCPの直下でない方がいいらしい。



同じような内容を開発ベンダに見積取ったら、
えらい金額が上がってきたので、作ってしまえというのが動機。