7

sqlplus を使用して、Oracle のテーブルから csv をスプールする必要があります。必要な形式は次のとおりです。

"HOST_SITE_TX_ID","SITE_ID","SITETX_TX_ID","SITETX_HELP_ID"
"664436565","16","2195301","0"
"664700792","52","1099970","0"

以下は、私が書いたシェル スクリプトの関連部分です。

sqlplus -s $sql_user/$sql_password@$sid << eof >> /dev/null
    set feedback off
    set term off
    set linesize 1500
    set pagesize 11000
  --set colsep ,
  --set colsep '","'
    set trimspool on
    set underline off
    set heading on
  --set headsep $
    set newpage none


    spool "$folder$filename$ext"
    select '"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"'
    from cvo_admin.MISSING_HOST_SITE_TX_IDS;
    spool off

(私が試したがうまくいかなかったことを示すために、いくつかのコメント付きステートメントを使用しました)

私が受け取る出力は次のとおりです。

'"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"'
"TRANSPORT INC","113","00000000","25-JAN-13 10.17.51 AM",""
"TRANSPORT INC","1905","00000000","25-JAN-13 05.06.44 PM","0"

これは、ヘッダーが台無しになっていることを示しています。表示されているデータの場合と同様に、SQL ステートメントとして解釈されるはずだった文字列全体を文字通り出力しています。

私が検討しているオプション:

1) コルセップの使用

set colsep '","'
spool
select * from TABLE
spool off

これにより、データの先頭と末尾にスペースがあり、ファイルの最初と最後の値が引用符で囲まれていないため、他の問題が発生します

    HOST_SITE_TX_ID","   SITE_ID"
    "             12345","      16"
    "             12345","      21

この方法は、以前に説明した方法よりも胸やけが多くなるという結論に達しました。

2) ファイルを取得し、正規表現を使用してヘッダーを変更します。

3) スクリプトを使用して、ヘッダーを完全に残し、ファイルの先頭に手動でヘッダー文字列を追加する

オプション 2 はより実行可能ですが、何らかの方法でヘッダーをフォーマットするより良い方法があるかどうかを尋ねることにまだ興味があったため、通常の csv (カンマ区切り、二重引用符で囲まれた) 形式で提供されます。

ハードコーディングをできるだけ少なくすることを検討しています-エクスポートしているテーブルには約40列があり、現在約400万レコードのスクリプトを実行しています-それぞれ約10Kのバッチでそれらを分割しています. 私のアプローチとはまったく異なる提案があれば、本当に感謝しています-私は学習のプログラマーです。

4

3 に答える 3

5

ヘッダーが1つだけのcsvを作成する簡単な方法の1つは、次のことです

set embedded on
set pagesize 0
set colsep '|'
set echo off
set feedback off
set linesize 1000
set trimspool on
set headsep off

これembeddedは非表示のオプションですが、ヘッダーを 1 つだけ持つことが重要です

于 2014-07-03T11:22:24.377 に答える