2013-07-31 45 views
6

我需要使用sqlplus從Oracle中的表中假脫機csv。以下是需要的格式:繼在sqlplus中假脫機csv文件時的頭格式化

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

的相關一塊shell腳本我寫的:

sqlplus -s $sql_user/[email protected]$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 

(我已經使用了一些評論語句,以表示我試過,但couldn的事情「T去上班)

我收到的輸出是:

'"'||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)使用COLSEP

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個記錄。我會非常感謝任何建議,甚至與我的方法完全不同 - 我是一名學習程序員。

回答

3

這是我創建了一個標題:

set heading off 

/* header */ 
SELECT '"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"' 
FROM 
(
     SELECT 'PCL_CARRIER_NAME' AS PCL_CARRIER_NAME 
     ,  'SITETX_EQUIP_ID' AS SITETX_EQUIP_ID 
     ,  'SITETX_SITE_STAT' AS SITETX_SITE_STAT 
     ,  'SITETX_CREATE_DATE' AS SITETX_CREATE_DATE 
     ,  'ADVTX_VEH_WT'  AS ADVTX_VEH_WT 
     FROM DUAL 
) 
UNION ALL 
SELECT '"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"' 
FROM 
(
     /* first row */ 
     SELECT to_char(123)     AS PCL_CARRIER_NAME 
     ,  to_char(sysdate, 'yyyy-mm-dd') AS SITETX_EQUIP_ID 
     ,  'value3'      AS SITETX_SITE_STAT 
     ,  'value4'      AS SITETX_CREATE_DATE 
     ,  'value5'      AS ADVTX_VEH_WT 
     FROM DUAL 
     UNION ALL 
     /* second row */ 
     SELECT to_char(456)      AS PCL_CARRIER_NAME 
     ,  to_char(sysdate-1, 'yyyy-mm-dd') AS SITETX_EQUIP_ID 
     ,  'value3'       AS SITETX_SITE_STAT 
     ,  'value4'       AS SITETX_CREATE_DATE 
     ,  'value5'       AS ADVTX_VEH_WT 
     FROM DUAL 
) MISSING_HOST_SITE_TX_IDS; 
5

一個簡單的方法有一個CSV只有一個頭是做

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

embedded是一個隱藏的選項,但它是非常重要的只有一個標題

+2

我很難看到這是如何回答這裏提出的問題。 –