AAC通信 -4ページ目

【ついに公開!!】DB2 UTF-8対応データベース移行によるカラムの桁数変換シェル

5月23日に『DB2 V9.1 UTF-8データベースへの移行手順』を書いてから、早2ヶ月。。。

ようやくカラムの桁数変換シェルを作りました。


シェルの注意点をまず。


(1)使い方

元の定義ファイルをシェルの引数にし、リダイレクトで変換後のファイルを作ります。

■例(シェルの名前をutf8_trans.ksh、定義ファイルをoutput.txtとしておきましょう)

>utf8_trans.ksh output.txt > output_utf8.txt


(2)シェルの流れ

・引数のチェック

・ファイル存在チェック

・定義ファイル1行ずつ変換

 →char、varchar型の()内の数字を1.5倍+0.5(小数点切捨て)

 →char型を1.5倍+0.5(小数点切捨て)をした場合、数字が254を超えたらcharをvarcharに変更する

・"*"の文字を''で囲む


(3)その他

・とりあえずcharとvarchar型のみ対応です。

・半角カタカナが入るカラムに対する3倍処理はしていません。。。全部1.5倍です。


前置きはこの辺にしておいて、以下シェルをはりつけます!


ここから下です。-----------------------------------------------

#/bin/ksh

#---------------------------------------------------------------
#■引数チェック
#---------------------------------------------------------------
#引数の数をチェック
if [ $# -lt 1 ]
then
echo "使用法: $0 [テーブル定義ファイル]"
exit -1
fi

#対象ファイル格納パスの取得
dif_file=$1

#----------------------------------------------------------------------
#テーブル定義ファイルがあるか.なければ終了.
#----------------------------------------------------------------------
if [ ! -a ${dif_file} ]

then
echo "[エラー]:$0テーブル定義ファイルが見つかりませんでした"
echo "$0:処理を終了します.\n"
exit 1
fi

#-----------------------------------------------------------------
#定義ファイルを読み込み1行ずつ定義を変更する
#-----------------------------------------------------------------

while read line
do
awk_check="` echo ${line} | awk '/CHAR/{print $2}' | cut -c 1`"

if [[ -n ${awk_check} ]]
then
if [ ${awk_check} = "C" -o ${awk_check} = "V" ]
then
NUMBER=`echo ${line} | awk '{print $2}' | sed -e "s/[^0-9]//g"`
INT_NUM=`expr ${NUMBER}`
MULTIPLE=`echo ${INT_NUM} \* 1.5 + 0.5 |bc`
ANSWER=`echo ${MULTIPLE} | cut -d "." -f 1`

if [ ${awk_check} = "C" -a ${ANSWER} -ge 254 ]
then
line=`echo ${line} | sed -e "s/CHAR(${NUMBER}/VARCHAR(${ANSWER}/g"`
else
line=`echo ${line} | sed -e "s/(${NUMBER}/(${ANSWER}/g"`
fi
fi
fi
echo "${line}" | sed -e "s/\*/'\*'/g"

done < $dif_file

-----------------------------------------------ここより上。



これで私の環境ではうまくいきました。


もし、「これはこうしたほうが」とか「これ違うんじゃない?」とかあれば、

是非ご意見いただければと思います!!!


以上です!