将大量日期从Oracle转移到csv的差异

时间:2017-09-25 12:42:59

标签: oracle csv spool

我需要从包含大约300万个数据的表中导出数据。该表有9列,格式如下:

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

但是当我使用notepad ++打开csv文件时,只显示大约600 000行,显示如下:

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

正如你所看到的,尽管表中的字段中没有空格,但某些字段中有很多空格,Num字段的0012值显示为12,最后一个字段显示在另一行。

更重要的是,表格的两行之间的csv中有一个空行。

如何使这些无用的空间消失,以及如何在csv中的单行显示整行数据,如何为Num字段显示00,以及为什么只有600 000是在Notepad ++中显示?我读到csv文件没有行限制。

我正在使用的sql如下:

SET SQLFORMAT csv
SET HEAD OFF

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

select * from TEST;

spool off;

2 个答案:

答案 0 :(得分:1)

首先,如果您使用SQL DeveloperTOAD,则可以更轻松地导出CSV。

但对于sql * plus,您可以使用set linesize 32000将所有列显示在一行上,set pagesize 0将删除初始CRLF。但是它以固定宽度格式显示列,因为这是假脱机输出的工作方式。

如果您想拥有可变宽度列,最便携的标准化方法是自己手动连接列,而不是使用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

答案 1 :(得分:0)

可能是因为数据库中的列长度。 假设数据库中的源列长度为50,则文件中的长度为50个字符。

在查询中尝试trimouttrimspool

SET TRIMOUT ON

SET TRIMSPOOL ON