CSV提取问题

时间:2015-05-28 09:35:59

标签: oracle sqlplus

我最近创建了一个使用sqlplus自动化提取的cron。我的.sh如下:

alter session set nls_numeric_characters= '.,' ;
alter session set nls_date_format='DD-MM-YYYY HH24:MI:SS';
set colsep ";"
SET TRIMSPOOL ON
SET HEADING OFF 
set echo off
SET FEEDBACK OFF
set verify off
set linesize 32767
set pagesize 0
set pause off
set termout off
set newp none
set space 0
set wrap off
set trim on
spool /data/Tools/Extract_W7/w7_errors.csv
Select HOST ||';'|| PORT ||';'|| PID ||';'|| OPX2DATE ||';'|| OPX2USER ||';'|| IP ||';'|| INFO  from V_W7_ERRORS where OPX2DATE > SYSDATE - 100;

spool off;
exit;

问题是在我的摘录中有一个带有特定符号的“INFO”列,例如; / @#,..所以我认为它混淆了使用的colsep“;”随着;在细胞中。

我尝试了不同的字符,但每次我遇到同样的问题(在同一个单元格中连接了很多行),因为我使用的字符已经在我的信息列中使用。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

通过连接查询中的列号,将列内容用双引号括起来:

Select HOST ||';'|| PORT ||';'|| PID ||';'|| OPX2DATE ||';'|| OPX2USER 
  ||';'|| IP ||';"'|| INFO || '"'
from V_W7_ERRORS where OPX2DATE > SYSDATE - 100;

重要位是';"'|| INFO || '"' which puts a“INFO内容的任一侧;请注意,双引号标记本身在单引号内,因此它作为字符串的一部分输出,不被视为带引号的标识符

输出如下:

...;192.168.0.1;"Some info; embedded semicolon is OK now"

当您在Excel中打开文件时,它不会将双引号括起的部分中的任何分号视为列分隔符,就像作为单元格值一部分的文本一样。

您可以在双引号中包含任意数量的列 - 任何可能包含分号的列。您可能希望将它们全部包含在内作为预防措施。