什么';从Amazon Redshift卸载创建RFC-4180友好CSV文件的最佳方法是什么?

什么';从Amazon Redshift卸载创建RFC-4180友好CSV文件的最佳方法是什么?,csv,amazon-redshift,Csv,Amazon Redshift,使用UNLOAD时,Amazon Redshift实际上没有CSV选项(例如,类似于PostgreSQL的COPY命令中提供的WITH CSV) 如果使用转义选项,则红移将用\转义双引号。例如,Excel不知道如何处理斜杠。根据RFC-4180,它应该使用双引号 如果使用双引号括起字段,则使用双引号 出现在字段中时,必须在其前面加上 另一个双引号。例如: “aaa”、“b”、“bb”、“ccc” 所以。。。除非我们能找到一种方法让红移正确地避开它们,否则报价将破坏导出 鉴于以下数据: # sel

使用
UNLOAD
时,Amazon Redshift实际上没有CSV选项(例如,类似于PostgreSQL的
COPY
命令中提供的
WITH CSV

如果使用
转义
选项,则红移将用
\
转义双引号。例如,Excel不知道如何处理斜杠。根据RFC-4180,它应该使用双引号

如果使用双引号括起字段,则使用双引号 出现在字段中时,必须在其前面加上 另一个双引号。例如:

“aaa”、“b”、“bb”、“ccc”

所以。。。除非我们能找到一种方法让红移正确地避开它们,否则报价将破坏导出

鉴于以下数据:

# select * from unload_test;
                 test_field                 | test_field_number
 --------------------------------------------+-------------------
 "No," she said, "that's not how we do it." |                 5
 Hi! This is a test, yo.                    |                 5
  • 如果我们使用
    ESCAPE
    但不使用
    ADDQUOTES
    ,Excel等会继续在所有逗号上断开列,包括“转义”的(
    \,
  • 如果我们同时使用
    ESCAPE
    ADDQUOTES
    ,您将得到您在初始问题示例中看到的结果
  • 如果我们使用
    ADDQUOTES
    ,但不使用
    ESCAPE
    ,那么它将在数据中使用双引号中断
  • 当然,如果我们不使用任何一个,那么我们也会在逗号和可能的引号上中断

是否有一种可以同时容纳数据中的引号和逗号的解决方法?

缩放解决方案是使用perl/sed处理内容并将其转换为正确的CSV

这些标志是必需的:
分隔符“,”ADDQUOTES ESCAPE

aws s3 cp s3://mybucket/non_csv/part_0000-|\
#仅当向后找到奇数个反斜杠时,才将“”取消为“”

perl-pe的/((?”)| perl-pe的/((?)从文档中看,它似乎还不够聪明,无法仅在需要引号时添加引号。在一个完美的世界中,您需要添加一个
RFC4180
子句,它就可以开始遵守标准。
$ echo '"","\"\"Hi\\\\\"","\\\\","\<tab>"' | perl -pe 's/((?<![\\])(\\\\)*)\\"/\1""/g' | perl -pe 's/((?<![\\])(\\\\)*)\\/\1/g' | sed -e 's/\\\\/\\/g'
"","""""Hi\\""","\\","<tab>"