mikan's technical note

仕事&趣味で実験した小技の備忘録です(Linux,windows,DOS等)

MENU

【Symfoware]】SELECT結果をCSV形式に変換する

solaris にて動作確認済み(1行20kの制限あり)

exportHead.awk

#! /usr/xpg4/bin/awk -f
###
############################################################
### SymfowareのSELECT結果から項目名をCSV形式で抽出する
### (c) 2018 mikan
### ※使用にあたっては利用者の自己責任でお願いします。
###
###   使い方:
###       /usr/xpg4/bin/awk -f exportHead.awk in.log > out.txt
############################################################
!/^Number.*|^SQL.*|^[sS][eE][lL][eE][cC][tT].*/ {
FS = ":";
gsub(" ","");
i ++;
    if($1 ~ /^<</) {
       if(i>1)
           exit
       else
           continue
    }else{
        j ++;
        if (j==1)
            printf $1
        else
            printf ","$1
    }
}END
EOF{print ""}

export.awk

#! /usr/xpg4/bin/awk -f

############################################################
### SymfowareのSELECT結果からデータをCSV形式で抽出する
### (c) 2018 mikan
### ※使用にあたっては利用者の自己責任でお願いします。
###
###   使い方:
###       /usr/xpg4/bin/awk -f export.awk in.log > out.log
###
###   参考:
###       パターン一致書式     $1 ~  / パターン /
###       パターン不一致書式   $1 ~ !/ パターン /
############################################################

BEGIN {
}

# 先頭文字が"SQL","Number","select"以外の行を処理する
!/^SQL|^Number|^[sS][eE][lL][eE][cC][tT]/ {
    FS=":";  ### 区切り文字設定

    #----- "<<"判定
    cnt++
    if($1~/^<</) {
        cnt=0
    }

    #----- 1データ終了判定
    if(cnt == 0) {
        #----- 初回(2行目)の"<<"は改行しない
        if(NR>2) {
            #----- 改行出力
            printf("\n")
        }
        continue
    }

    #----- データ部にコロンがある場合の対応  $X=$2,$3,$4...
    for(X=2; X<=NF; X++) {

        #----- 数値タイプはダブルコーテーション不要
        if ($2~/^([+-])([0-9]*\..*)/) {
            #----- カンマ出力判定
            if(X == 2 && cnt == 1) {
            }
            else if(X == 2) {
                printf(",")
            }
        }
        #----- ダブルコーテーション(開始)出力
        else {
            #----- カンマ出力判定
            if(X == 2 && cnt == 1) {
                printf("\"")
            } else if(X == 2) {
                printf(",\"")
            }
        }
  
        #----- データ内のコロン出力
        if(X >=3) {
            printf(":")
        }

        #----- データ出力
        printf("%s", $X)
    }

    if ($2~/^([+-])([0-9]*\..*)/) {
        #----- 数値タイプはダブルコーテーション不要
    } else {
        #----- ダブルコーテーション(終了)出力
        if(cnt > 0) {
            printf("\"");
        }
    }
}

END {
    #----- 改行出力(最終行)
    printf("\n")
}

LogCnv.sh
>|sh|
#!/usr/bin/bash
############################################################
### SELECT結果をCSV形式に変換
### (c) 2018 mikan
### ※使用にあたっては利用者の自己責任でお願いします。
###
###   使い方:
###       csv_convert.sh in.log out.txt
############################################################

/usr/xpg4/bin/awk -f ./exportHead.awk $1 > $2
/usr/xpg4/bin/awk -f ./export.awk $1 >> $2

exit 0