【问题标题】:Oracle - spool to CSV file, but Excel splits "$10,000" into two columnsOracle - 假脱机到 CSV 文件,但 Excel 将“$10,000”分成两列
【发布时间】:2017-06-01 17:54:37
【问题描述】:

我有一个命令如下:

SPOOL &&p_CSVfile

SELECT
  YEAR || ', ' ||
  TO_CHAR(AMOUNT, '$9,999,999,999.99')
FROM TABLE  

SPOOL OFF

...AMOUNT 字段中的值可以包含逗号。在 Microsoft Excel 中打开此文件时,如果 AMOUNT 字段包含逗号,则它会被视为两个单独的字段。有没有一种我不知道的简单方法,或者我必须更改分隔符?

【问题讨论】:

  • 如果您不需要千、百万等的逗号分隔符,只需替换逗号REPLACE(Amount,',',''),或将您的值用引号括起来'"' + Amount + '"'
  • Spool 只是创建一个文本文件。它不会将字符串用引号括起来。您可以使用 Oracle utl_file 包来精确控制您的输出,或者使用类似 SQLDeveloper 版本 4 的东西,它具有“提示”/* csv*/ 来正确分隔 csv 输出。

标签: excel oracle csv delimiter


【解决方案1】:

CSV 将每个逗号分隔值用双引号括起来。您的每个值都用双引号括起来吗?如果没有,

考虑:(将下面的内容复制并粘贴到记事本另存为 csv)

"This is a","test"
"This is,a","test"
10,000,500
"$10,000","500"
"And she said, ""Hello my love""","end"

第 1、2、4、5 行仅产生 2 列。第 3 行结果为 3。引号很重要。

所以...要解决添加 begin/end " 到您正在输出的每个值(什么是 " chr(34)?)

SELECT chr(34) || YEAR || chr(34) ||',' || 
       chr(34) || AMOUNT ||chr(34)
FROM TABLE  

如果您导出的字符串数据中包含引号...只需将它们加倍以正确转义。

【讨论】:

  • 为什么要使用 chr(34) 而不是 " " ?
  • 另外,当我按照这个方法,我得到以下错误:ORA-01741:非法零长度标识符
  • 听起来有些年份和金额或其他值可能是“NULL”,并且连接 null 不起作用。需要合并(字段,'')以将长度为零的字符串...虽然oracle
  • 我目前正在处理一个很小的数据集并且没有空值 =/
  • 我们似乎在重新发明轮子--stackoverflow.com/questions/4168398/…
【解决方案2】:

用双引号将您的值括起来 '"' || Amount || '"'

完整示例

SPOOL &&p_CSVfile

SELECT
  '"' || YEAR || '","' || AMOUNT || '"'
FROM TABLE  

SPOOL OFF

如果您在特定字段中不需要逗号,您也可以REPLACE他们,即REPLACE(Amount,',','')

【讨论】:

  • 所以最终用户必须手动将列格式化为货币?
  • 不是在第一个例子中,而是在第二个例子中。您的金额列是money 类型还是string 类型?
  • 这是一个使用 TO_CHAR 转换的数字 - 我已更新我的问题以包含此详细信息。
  • 好吧,我只是了解设计原则。我将根据我对 string 是列类型的假设更新我的答案以排除其他信息。
  • 我确实需要逗号,所以我没有使用 REPLACE()。我仍然遇到同样的问题。嗯。我可能只需要更改我的分隔符。
猜你喜欢
  • 2016-12-27
  • 2011-05-08
  • 2020-08-06
  • 1970-01-01
  • 1970-01-01
  • 2021-07-13
  • 1970-01-01
  • 1970-01-01
  • 2021-10-11
相关资源
最近更新 更多