2015-05-20 106 views
2

我有一個通過命令行將數據(包括CLOB)從Oracle SQL導出爲CSV的腳本。當我執行腳本,然後通過Python查看數據時,我會得到每行正確的列數以及正確的數據。但是,每個單元格都有額外的空間。我的方法:從Oracle SQL從命令導出爲CSV

file.sql

spool "/home/username/file.csv"; 
SELECT /*csv*/ '"'||COLUMN_1||'"', 
'"'||COLUMN_2||'"', 
'"'||DBMS_LOB.substr(COLUMN_3,3000)||'"', 
     ... 
'"'||COLUMN_N||'"' 
FROM TABLE; 
spool off; 

file.sh

export ORACLE_SID=MYSID 
sqlplus/as sysdba <<EOF 
conn myUser/myPass 
set heading off 
set termout off 
set trimout off 
set newpage none 
set pages 0 
set feedback off 
set echo off 
set verify off 
set trimspool on 
set sqlprompt "" 
set colsep "," 
set linesize 32767  
@/home/username/file.sql 
exit 
EOF 

當我試圖通過修剪串聯空間,整個事情分崩離析(不平等列長度,中斷應該沒有,等等):

修改file.sql

spool "/home/username/file.csv"; 
SELECT /*csv*/ '"'||COLUMN_1||'"'||',' 
'"'||COLUMN_2||'"'||',' 
'"'||DBMS_LOB.substr(COLUMN_3,3000)||'"'||',' 
     ... 
'"'||COLUMN_N||'"' 
FROM TABLE; 
spool off; 

我在做什麼錯在這裏?我也嘗試了一些其他的連接方法,比如使用||'","'||來代替,但這似乎也不起作用。

+0

您是否檢查過數據中的空格?嘗試在列的周圍添加TRIM()。 –

+0

數據中沒有空格,而TRIM()似乎不起作用。要清楚,我的輸出如下所示:「VALUE」/ s/s/s/s/s/s/s/s/s/s,「VALUE2」/ s/s/s/s/s/s/s/s/s/s/s,/ s/s/s/s/s/s/s「VALUE3」/ s/s/s/s/s/s/s/「」內的輸出很好。 – datasci

+0

無視我上面的評論,並看到我發佈的答案。 –

回答

0

檢查了這一點:從這篇文章:https://community.oracle.com/thread/2357292

給每個所選列的別名。然後它爲我工作。

SELECT /*csv*/ '"'||COLUMN_1||'"' COL1, 
'"'||COLUMN_2||'"'    COL2, 
'"'||DBMS_LOB.substr(COLUMN_3,3000)||'"' COL3, 
     ... 
'"'||COLUMN_N||'"' COLN 
FROM TABLE; 

編輯:添加我的例子從運行在蟾蜍。

在蟾蜍,我運行此:

set heading off 
set termout off 
set trimout off 
set newpage none 
set pages 0 
set feedback off 
set echo off 
set verify off 
set trimspool on 
set trimout on 
set tab off 
set sqlprompt "" 
set colsep "," 
set linesize 32767  

spool c:\temp\efs.txt; 

SELECT '"'||'A'||'"', 
'"'||'B'||'"', 
'"'||'C'||'"' 
FROM dual; 

spool off; 

,並得到:

"A"   ,"B"   ,"C" 

當我添加了列別名:

SELECT '"'||'A'||'"' a, 
'"'||'B'||'"' b, 
'"'||'C'||'"' c 
FROM dual; 

我得到:

"A","B","C" 

看到這個線程的另一種方法和解釋(這是我們如何做到這一點):https://community.oracle.com/thread/1081068

+0

這似乎也不適用於我。我會嘗試||'「,」||別名旁邊。說實話,我總是可以用Python修剪單元格 - 我只是希望在SQL中有一個合適的解決方案。 – datasci

+0

請看我更新的例子。 –

+0

從dual for header中選擇時,我會和你一樣,但只要從TABLE中選擇,它不適用於我。 :-( – datasci

0

如何:

select col1 || ',' || col2 || ',' || col3 from tab1; 

select '"' || col1 || '",' || '"' || col2 || '",' || '"' || finalcol || '"' from tab1; 

例如

SQL> select '"' || AD_ID || '",' || '"' || AD_SOURCETEXT || '",' || '"' || PRODUCT_ID || '"' from pm.print_media where rownum < 4; 

'"'||AD_ID||'",'||'"'||AD_SOURCETEXT||'",'||'"'||PRODUCT_ID||'"' 
-------------------------------------------------------------------------------- 
"11001","TIGER2 Mousepad 
Product Number: 2056 Price: $8 Today's Sale Price 

"12001","TIGER2 Mousepad 
Product Number: 2056 Price: $8 Today's Sale Price 

"13001","TIGER2 3106 Keyboard 
Product Number: 3106 
* KB 101/EN keyboard is a sta