我想将数据从netezza数据库导出到CSV文件。
数据的格式将为:
col1,col2,col3
或:
"col1","col2","col3"
我正在使用查询:
CREATE EXTERNAL TABLE 'H:\test.csv' USING ( DELIMITER ',' REMOTESOURCE 'ODBC' ) AS
SELECT * FROM TEST_TABLE
当col3具有包含逗号的字段时,上述查询不起作用,因为它说使用转义字符将其导出为"\"。
示例表:
A | B | C
a | b | Germany, NA
我也试过了,但我得到了csv的输出:
a,b,Germany, NA
或者通过在我得到输出的每一列添加引号:
"a","b","Germany, NA"
在这里,我在字段中获得了额外的"\"字符。 我正在寻找使用nzsql或外部表查询方法或仅编写自己的脚本方法来解决它的解决方案。
在不更改字段数据的情况下,我的预期输出:
"a","b","德国, NA">
可以使用 nzsql 命令行语句实现所需的输出。这种方法的唯一限制是 最大文件将限制为2 GB.下面是 IBM KB 将查询结果发送到输出文件的链接
[nz@netezza ~]$ nzsql -d test -A -t -c "select quote_ident(col1),quote_ident(col2), quote_ident(col3) from test" -o '/nzscratch/test.csv'
输出:
[nz@netezza ~]$ cat /nzscratch/test.csv
"A"|"B"|"C"
a|b|"Germany, NA"
您可以使用,仅将反斜杠用作转义字符。问题是 csv 文件需要一种方法来表示"这个逗号是数据,而不是分隔符"——这就是转义字符的用途。使用 csv 文件的代码应配置为需要相同的转义字符。ESCAPECHAR '@'
来使用"@"而不是反斜杠
这是您在使用松散定义的数据格式(如 csv)时遇到的怪癖之一。只要你定义了一个生产者和使用者都期望的分隔符和一个转义字符 - 并且你使用相同的字符编码 - 你就会没问题。
这不是在更改您的数据,只是使交换格式更加具体。如果您提供有关使用数据的内容的一些详细信息,我可以更新此答案以提供有关通知使用者反斜杠用作转义字符的详细信息。
--编辑-- 显然,netezza 的某些实现仅支持反斜杠作为分隔符。
IBM 参考资料:
- 报价值
- 逃脱夏尔
- 定界符