2017-09-25 36 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