我需要使用sqlplus从Oracle的表中溢出一个csv文件。下面是所需的格式:
以下是我编写的 shell 脚本的相关部分:
这段文字表明标题出现了问题 - 实际上是打印了整个字符串,本应被解释为SQL语句,这也是显示的数据的情况。
我正在考虑如下选项:
1)使用colsep
这会引入其他问题,比如数据可能存在前导和尾随空格,文件中的第一个和最后一个值没有用引号括起来。
我得出结论,这种方法比我之前描述的方法更加令人烦恼。
2) 获取文件并使用正则表达式修改标题。
3) 完全离开标题,并手动在文件开头添加一个标题字符串,使用脚本。
选项2更可行,但我仍然想问一下,是否有更好的方法来格式化标题,使其成为常规csv(逗号分隔,双引号包围)格式。
我希望尽可能少地进行硬编码——我要导出的表格大约有40列,并且我目前正在运行大约400万条记录的脚本——将它们分成每个批次约10K。 我非常感谢任何建议,甚至与我的方法完全不同-我是一名学习中的程序员。
"HOST_SITE_TX_ID","SITE_ID","SITETX_TX_ID","SITETX_HELP_ID"
"664436565","16","2195301","0"
"664700792","52","1099970","0"
以下是我编写的 shell 脚本的相关部分:
sqlplus -s $sql_user/$sql_password@$sid << eof >> /dev/null
set feedback off
set term off
set linesize 1500
set pagesize 11000
--set colsep ,
--set colsep '","'
set trimspool on
set underline off
set heading on
--set headsep $
set newpage none
spool "$folder$filename$ext"
select '"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"'
from cvo_admin.MISSING_HOST_SITE_TX_IDS;
spool off
我使用了一些注释语句来表示我尝试过但无法正常工作的内容。
我收到的输出是:
'"'||PCL_CARRIER_NAME||'","'||SITETX_EQUIP_ID||'","'||SITETX_SITE_STAT||'","'||SITETX_CREATE_DATE||'","'||ADVTX_VEH_WT||'"'
"TRANSPORT INC","113","00000000","25-JAN-13 10.17.51 AM",""
"TRANSPORT INC","1905","00000000","25-JAN-13 05.06.44 PM","0"
这段文字表明标题出现了问题 - 实际上是打印了整个字符串,本应被解释为SQL语句,这也是显示的数据的情况。
我正在考虑如下选项:
1)使用colsep
set colsep '","'
spool
select * from TABLE
spool off
这会引入其他问题,比如数据可能存在前导和尾随空格,文件中的第一个和最后一个值没有用引号括起来。
HOST_SITE_TX_ID"," SITE_ID"
" 12345"," 16"
" 12345"," 21
我得出结论,这种方法比我之前描述的方法更加令人烦恼。
2) 获取文件并使用正则表达式修改标题。
3) 完全离开标题,并手动在文件开头添加一个标题字符串,使用脚本。
选项2更可行,但我仍然想问一下,是否有更好的方法来格式化标题,使其成为常规csv(逗号分隔,双引号包围)格式。
我希望尽可能少地进行硬编码——我要导出的表格大约有40列,并且我目前正在运行大约400万条记录的脚本——将它们分成每个批次约10K。 我非常感谢任何建议,甚至与我的方法完全不同-我是一名学习中的程序员。