2017-09-25 69 views
0

我需要從包含約300萬個數據的表中導出數據。該表具有9列,並且在下面的格式:將大量日期從Oracle轉換爲csv的差異

Source | Num | User | Offer | Simul | Start_Date | End_Date | Label | Value 
coms p | 0012| plin | synth | null | 04-JAN-15 | 31-JAN-15| page v | 8 

然而,當我使用記事本+ +僅約爲600 000線被顯示,並且顯示如下打開csv文件:

coms p          ,12,plin           ,synth                        ,                         ,04/01/2015 00:00:00,04/01/2015 00:00:00,page v                                 
8 

正如你所看到的,儘管表中的字段中沒有空格,但某些字段中有很多空格,Num字段的0012值顯示爲12,最後一個字段顯示在另一行上。

更重要的是,在表格的2行之間的csv中有一個空行。

任何有關如何使這些無用空間消失的想法,以及如何在csv的單行中顯示整行數據,如何使00出現在Num字段以及爲什麼只有600 000是在Notepad ++中顯示?我讀過csv文件沒有行限制。

我使用SQL低於:

SET SQLFORMAT csv 
SET HEAD OFF 

spool /d:/applis/test/file.csv 

select * from TEST; 

spool off; 
+1

你在做什麼? SQL Developer,TOAD,Sql * Plus?什麼版本?它有所作爲 - 'SET SQLFORMAT csv'不是標準選項。 – kfinity

回答

0

這可能是因爲在數據庫中的列長度。 假設數據庫中的源列長度爲50,則文件中的長度爲50個字符。

嘗試trimouttrimspool查詢爲:

SET TRIMOUT ON 

SET TRIMSPOOL ON 
+0

是的,我認爲你是對的。第一列確實是50個字節。但是,您是否知道爲什麼當我在記事本++中打開csv時只顯示600 000行?該表包含大約300萬行。 – tabby

+0

不確定,如果我能夠找到背後的原因,會讓你。 –

+0

您可以使用SET AUTOTRACE ON來檢查它是處理表中的所有記錄還是處理僅600000條記錄 –

1

首先,有更容易的方式,如果你正在使用SQL DeveloperTOAD導出CSV。

但是對於sql * plus,您可以使用set linesize 32000來獲取所有列在一行中顯示,並且set pagesize 0將擺脫初始CRLF。但它以固定寬度格式顯示列,因爲這是spool輸出的工作方式。

如果您想要具有可變寬度的列,最便攜的標準方式是手動連接列而不使用select *

set linesize 32000 -- print as much as possible on each line 
set trimspool on -- don't pad lines with blank spaces 
set pagesize 0  -- don't print blank lines between some rows 
set termout off -- just print to spool file, not console (faster) 
set echo off  -- don't echo commands to output 

set feedback on -- just for troubleshooting; will print the rowcount at the end of the file 

spool /d:/applis/test/file.csv 
select col1 || ',' || col2 || ',' || col3 from TEST; 
spool off