使用 BASH 脚本假脱机 CSV 文件 |生成的 CSV 中的输出错误
Spool CSV file using BASH Script | Errors with Output in generated CSV
我需要将表的输出从 db 假脱机到 CSV 文件。
我检查并参考了 How do I spool to a CSV formatted file using SQLPLUS?
但它没有成功运行。我得到的只是前 3 列被 ,
分隔,而不是其余的。其他人被换行分隔。
编辑:正在假脱机的 Table 的架构详细信息。
WWID VARCHAR2 (5 Byte)
TIMELOG_DATE DATE
TOTAL_HOURS NUMBER (10,2)
ACTIVITY VARCHAR2 (100 Byte)
SUBACTIVITY VARCHAR2 (100 Byte)
REF_PROJECT_ID VARCHAR2 (30 Byte)
REF_PROJECT_DESC VARCHAR2 (250 Byte)
WORK_REQUEST_ID VARCHAR2 (30 Byte)
EMP_COMMENTS VARCHAR2 (100 Byte)
APPROVER_COMMENTS VARCHAR2 (100 Byte)
脚本:
echo "\n>>> ******Data Processing Started at `date '+%d-%m-%Y %T %Z'`******" >>${LOGFILE}
sqlplus $fims_user/$fims_pwd << EOF
set serveroutput on;
set colsep , ;-- separate columns with a comma
set pagesize 0 ;-- No header rows
set trimspool on ;-- remove trailing blanks
set headsep off ;-- this may be useful...depends on your headings.
spool /home/fimsctl/datafiles/outbound/timelog/timelog_file_`date +%y%m%d`.csv
select * from FIMS_OWNER.TIMELOG_EXTRACT_OUTBOUND_T;
commit;
spool off
exit
EOF
echo "\n>>> ******Data Load Completed at `date '+%d-%m-%Y %T %Z'`******" >>${LOGFILE}
echo "End of the script">> ${LOGFILE}
并且 CSV 格式的输出 我得到的是:
SQL> select * from FIMS_OWNER.TIMELOG_EXTRACT_OUTBOUND_T;
iv315,29-DEC-14, 8
DUMMY
REF01
New Ref Project of type CPRM
66
NA
iv315,30-DEC-14, 8
DUMMY
REF01
New Ref Project of type CPRM
66
NA
iv315,31-DEC-14, 8
DUMMY
REF01
New Ref Project of type CPRM
66
NA
即值由换行符分隔(当在写字板中看到时)
谢谢
默认行大小为 80 个字符,因此默认情况下,当超过该长度时,列将换行。您的 100 字节列将导致该行为。您可以添加 SQL*Plus 命令来更改它:
-- any number at least as large as the longest possible output
set linesize 1024
set wrap off
select *
通常不受欢迎,因为如果 table 定义发生变化(即添加一列),或者如果 table 中的列以不同的顺序排列,输出可能会发生意外变化不同的环境。 (这可以说不应该发生在源代码管理中,并且只要您不使用 *
通常就没有关系。如果您明确列出您想要的列,连接它们并没有太多额外的工作使用手动添加的分隔符,例如:
select wwid
||','|| to_char(timelog_date, 'DD-MON-YY') -- or another format
||','|| total_hours
||','|| activity
||','|| subactivity
... -- etc
from FIMS_OWNER.TIMELOG_EXTRACT_OUTBOUND_T;
这将删除当前将所有 CSV 行填充到相同长度的额外空白,并减小输出文件的大小。输出是单列,因此 colsep
设置不再相关。
我需要将表的输出从 db 假脱机到 CSV 文件。 我检查并参考了 How do I spool to a CSV formatted file using SQLPLUS?
但它没有成功运行。我得到的只是前 3 列被 ,
分隔,而不是其余的。其他人被换行分隔。
编辑:正在假脱机的 Table 的架构详细信息。
WWID VARCHAR2 (5 Byte)
TIMELOG_DATE DATE
TOTAL_HOURS NUMBER (10,2)
ACTIVITY VARCHAR2 (100 Byte)
SUBACTIVITY VARCHAR2 (100 Byte)
REF_PROJECT_ID VARCHAR2 (30 Byte)
REF_PROJECT_DESC VARCHAR2 (250 Byte)
WORK_REQUEST_ID VARCHAR2 (30 Byte)
EMP_COMMENTS VARCHAR2 (100 Byte)
APPROVER_COMMENTS VARCHAR2 (100 Byte)
脚本:
echo "\n>>> ******Data Processing Started at `date '+%d-%m-%Y %T %Z'`******" >>${LOGFILE}
sqlplus $fims_user/$fims_pwd << EOF
set serveroutput on;
set colsep , ;-- separate columns with a comma
set pagesize 0 ;-- No header rows
set trimspool on ;-- remove trailing blanks
set headsep off ;-- this may be useful...depends on your headings.
spool /home/fimsctl/datafiles/outbound/timelog/timelog_file_`date +%y%m%d`.csv
select * from FIMS_OWNER.TIMELOG_EXTRACT_OUTBOUND_T;
commit;
spool off
exit
EOF
echo "\n>>> ******Data Load Completed at `date '+%d-%m-%Y %T %Z'`******" >>${LOGFILE}
echo "End of the script">> ${LOGFILE}
并且 CSV 格式的输出 我得到的是:
SQL> select * from FIMS_OWNER.TIMELOG_EXTRACT_OUTBOUND_T;
iv315,29-DEC-14, 8
DUMMY
REF01
New Ref Project of type CPRM
66
NA
iv315,30-DEC-14, 8
DUMMY
REF01
New Ref Project of type CPRM
66
NA
iv315,31-DEC-14, 8
DUMMY
REF01
New Ref Project of type CPRM
66
NA
即值由换行符分隔(当在写字板中看到时)
谢谢
默认行大小为 80 个字符,因此默认情况下,当超过该长度时,列将换行。您的 100 字节列将导致该行为。您可以添加 SQL*Plus 命令来更改它:
-- any number at least as large as the longest possible output
set linesize 1024
set wrap off
select *
通常不受欢迎,因为如果 table 定义发生变化(即添加一列),或者如果 table 中的列以不同的顺序排列,输出可能会发生意外变化不同的环境。 (这可以说不应该发生在源代码管理中,并且只要您不使用 *
通常就没有关系。如果您明确列出您想要的列,连接它们并没有太多额外的工作使用手动添加的分隔符,例如:
select wwid
||','|| to_char(timelog_date, 'DD-MON-YY') -- or another format
||','|| total_hours
||','|| activity
||','|| subactivity
... -- etc
from FIMS_OWNER.TIMELOG_EXTRACT_OUTBOUND_T;
这将删除当前将所有 CSV 行填充到相同长度的额外空白,并减小输出文件的大小。输出是单列,因此 colsep
设置不再相关。