从SQL导出的CSV数据中的前导和尾随空格

时间:2014-02-04 10:04:27

标签: sql oracle csv

我正在使用一个函数从SQL数据库中提取数据并将其回显到一个文件,然后通过电子邮件发送。 但是,CSV文件中的某些字段(使用Microsoft Excel打开时)显示前导/尾随空格。

SQL示例:

function pull_data
{
    sqlplus -s $user/$pass@$db <<EOF
    SET COLSEP ,
    SET LINESIZE 10000
    SET PAGESIZE 50000
    SET NEWPAGE NONE
    SET HEADING OFF
    SET FEEDBACK OFF
    SET ECHO OFF
    SELECT DISTINCT order_number,
                    TO_CHAR(entry_date,'DD/MM/YYYY'),
                    TO_CHAR(delivery_date,'DD/MM/YYYY'),
                    cust_name,
                    ...
}

echo "$(pull_data $a $b)" > $id.csv

间距示例(无法通过Stack Overflow上传):

http://s3.postimg.org/ekgt9ig4f/Capture.png

可以做些什么来使输出正确,即没有前导或尾随空格?

2 个答案:

答案 0 :(得分:1)

好的,所以在这种情况下,如何选择列并不重要。修剪可以通过OS shell完成,而不是尝试在Oracle中完成。

更改最后一行:

echo "$(pull_data $a $b)" > $id.csv

echo "$(pull_data $a $b)" | tr -d '\040\011' > $id.csv

这使用linux tr(translate)实用程序从输出中删除空格(\ 040)和制表符(\ 011)。

编辑:

如果输出需要包含显式空格,则将它们替换为数据中不存在的字符,但这是一个相当不优雅的黑客。变化:

SELECT COL1,
       COL2 || ' ' || COL3
FROM   ...

SELECT COL1,
       COL2 || '###' || COL3
FROM   ...

,最后一行变为:

echo "$(pull_data $a $b)" | tr -d '\040\011' | tr --squeeze-repeats [#] ['\040'] > $id.csv

答案 1 :(得分:0)

蒂姆·霍尔写了一篇关于此的文章:

http://www.oracle-base.com/articles/9i/generating-csv-files.php

我发现他的网站是Oracle内容的最佳来源之一

如果您有CHAR列,请使用TRIM函数删除前导/尾随空格