我们正在将 Postgres 9.3 中的数据导出到一个文本文件中,以供 Spark 提取。
我们希望使用 ASCII 31 字段分隔符而不是\t 作为分隔符,这样我们就不必担心转义问题。
我们可以在这样的 shell 脚本中这样做:
#!/bin/bash
DELIMITER=$'\x1F'
echo "copy ( select * from table limit 1) to STDOUT WITH DELIMITER '${DELIMITER}'" | (psql ...) > /tmp/ascii31
但我们想知道,是否可以在“纯”postgres 中指定一个不可打印的字形作为分隔符?
编辑:我们尝试根据 http://www.postgresql.org/docs/9.3/static/sql-syntax-lexical.html 使用 postgres 转义约定
warehouse=> copy ( select * from table limit 1) to STDOUT WITH DELIMITER '\x1f';
收到了
ERROR: COPY delimiter must be a single one-byte character
最佳答案
尝试在您尝试用作定界符的序列之前添加 E。例如 E'\x1f'
而不是 '\x1f'
。如果没有 E,PostgreSQL 会将 '\x1f'
读取为四个单独的字符,而不是十六进制转义序列,因此会出现错误消息。
参见 the PostgreSQL manual on "String Constants with C-style Escapes"获取更多信息。
关于postgresql - 使用 ASCII 31 字段分隔符作为 Postgresql COPY 分隔符,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28568747/