RError.com

RError.com Logo RError.com Logo

RError.com Navigation

  • 主页

Mobile menu

Close
  • 主页
  • 系统&网络
    • 热门问题
    • 最新问题
    • 标签
  • Ubuntu
    • 热门问题
    • 最新问题
    • 标签
  • 帮助
主页 / 问题 / 1602599
Accepted
mrgervant
mrgervant
Asked:2024-12-16 22:51:07 +0000 UTC2024-12-16 22:51:07 +0000 UTC 2024-12-16 22:51:07 +0000 UTC

使用 COPY TO CSV 时将 NULL 导出为“”

  • 772

使用 Python,我使用以下查询将表从 Postgresql 保存到 CSV:

copy ({function}) to stdout with (format csv, delimiter ',', header true, force_quote *);

这个请求在哪里{function}:select ...

请求本身通过以下方式调用copy_expert:

with db_connection.cursor() as cursor, open(file_path, "w") as file:
    cursor.copy_expert(query, file)

一切正常,只有 null 在最终的 csv 中被写入为空值:

... "1",,,,"9597a9724d4dfd0c40681a0", ...
       ^^^^

我需要将 null 保存为"":

... "1","","","","9597a9724d4dfd0c40681a0", ...
       ^^^^^^^^^^

如果我理解正确的话,COPY函数中的NULL参数表示读取CSV时哪些值被识别为null。

是否可以做相反的事情 - 当写入 CSV null 时,将其写为""

或者只是进入原始选择并使用 COALESCE 将每列的 null 替换为空行 - 因为用空字符串初步手动替换 null 有帮助吗?我想知道是否可以使用 COPY 参数配置所需的行为。

UPD:根据@Mike的评论,COPY TO也可以接受NULL值作为参数,但不能传递双引号:

NULL ''           ->  осталось также ,,,
NULL ""           ->  zero-length delimited identifier at or near """"
NULL ''''         ->  null requires a parameter
NULL ''''''       ->  null requires a parameter
NULL '""'         ->  CSV quote character must not appear in the NULL specification
NULL '""""'       ->  CSV quote character must not appear in the NULL specification
NULL E'\'\''      ->  изменилось на ,',',
NULL E'\'\'\'\''  ->  изменилось на ,'','',
NULL E'\"\"'      ->  CSV quote character must not appear in the NULL specification
NULL E'\"\"\"\"'  ->  CSV quote character must not appear in the NULL specification
python
  • 1 1 个回答
  • 36 Views

1 个回答

  • Voted
  1. Best Answer
    mrgervant
    2024-12-17T20:59:50Z2024-12-17T20:59:50Z

    感谢@Mike澄清COPY TO 中的 NULL 参数也接受将写入 CSV 的值而不是 NULL 值。

    然而,根据测试和文档的字面解释,COPYPostgreSQL 中的函数无法将 NULL 包装在定义为 QUOTE 的字符中,根据PostgreSQL 9.5 -“CSV Format”块的文档:

    CSV 格式没有区分 NULL 值和空字符串的标准方法。在 PostgreSQL 中,COPY 命令通过使用引号解决了这个问题。 NULL 值将输出为 NULL 参数指定的字符串,并且不包含在引号中,而非 NULL 值将输出为 NULL 参数指定的字符串。例如,使用默认选项时,NULL 将被写入不带引号的空字符串,而空字符串将被写入双引号 ("") 内。

    默认情况下,QUOTE 是双引号字符"。当尝试将它们指定为 NULL 时,会发生错误:

    CSV 引号字符不得出现在 NULL 规范中

    例如,这样的调用将导致以下错误:

    copy ({function}) to stdout with (format csv, delimiter ',', null '""', header true, force_quote *);
    

    如果您定义自己的 QUOTE,则该符号"将可以访问 NULL:

    copy ({function}) to stdout with (format csv, delimiter ',', quote '~', null '""', header true, force_quote *);
    
    >>> ... ~1~,"","","",~9597a9724d4dfd0c40681a0~, ...
    

    但是,相应地,现在尝试将 NULL 参数设置为null '~~'。

    有两种方法可以摆脱这种情况:

    1. 在原始 SELECT 查询中,对于可能出现 NULL 的每一列,使用COALESCE函数将 NULL 转换为空字符串 - 使用 FORCE_QUOTE 选项,它们将完全用双引号引起来:
    COALESCE(field, '')  >>>  Поля со значениями NULL преобразуются в ''
    
    1. 使用不同的、更灵活的方法来生成 CSV 文件不是COPY TO+ copy_expert。因此,在这个问题的框架内,当切换到pandaswith 时,pd.to_csv(quoting=csv.QUOTE_ALL)所有数据和标题都用双引号引起来,包括。和 NULL。
    • 0

相关问题

  • 是否可以以某种方式自定义 QTabWidget?

  • telebot.anihelper.ApiException 错误

  • Python。检查一个数字是否是 3 的幂。输出 无

  • 解析多个响应

  • 交换两个数组的元素,以便它们的新内容也反转

Sidebar

Stats

  • 问题 10021
  • Answers 30001
  • 最佳答案 8000
  • 用户 6900
  • 常问
  • 回答
  • Marko Smith

    我看不懂措辞

    • 1 个回答
  • Marko Smith

    请求的模块“del”不提供名为“default”的导出

    • 3 个回答
  • Marko Smith

    "!+tab" 在 HTML 的 vs 代码中不起作用

    • 5 个回答
  • Marko Smith

    我正在尝试解决“猜词”的问题。Python

    • 2 个回答
  • Marko Smith

    可以使用哪些命令将当前指针移动到指定的提交而不更改工作目录中的文件?

    • 1 个回答
  • Marko Smith

    Python解析野莓

    • 1 个回答
  • Marko Smith

    问题:“警告:检查最新版本的 pip 时出错。”

    • 2 个回答
  • Marko Smith

    帮助编写一个用值填充变量的循环。解决这个问题

    • 2 个回答
  • Marko Smith

    尽管依赖数组为空,但在渲染上调用了 2 次 useEffect

    • 2 个回答
  • Marko Smith

    数据不通过 Telegram.WebApp.sendData 发送

    • 1 个回答
  • Martin Hope
    Alexandr_TT 2020年新年大赛! 2020-12-20 18:20:21 +0000 UTC
  • Martin Hope
    Alexandr_TT 圣诞树动画 2020-12-23 00:38:08 +0000 UTC
  • Martin Hope
    Air 究竟是什么标识了网站访问者? 2020-11-03 15:49:20 +0000 UTC
  • Martin Hope
    Qwertiy 号码显示 9223372036854775807 2020-07-11 18:16:49 +0000 UTC
  • Martin Hope
    user216109 如何为黑客设下陷阱,或充分击退攻击? 2020-05-10 02:22:52 +0000 UTC
  • Martin Hope
    Qwertiy 并变成3个无穷大 2020-11-06 07:15:57 +0000 UTC
  • Martin Hope
    koks_rs 什么是样板代码? 2020-10-27 15:43:19 +0000 UTC
  • Martin Hope
    Sirop4ik 向 git 提交发布的正确方法是什么? 2020-10-05 00:02:00 +0000 UTC
  • Martin Hope
    faoxis 为什么在这么多示例中函数都称为 foo? 2020-08-15 04:42:49 +0000 UTC
  • Martin Hope
    Pavel Mayorov 如何从事件或回调函数中返回值?或者至少等他们完成。 2020-08-11 16:49:28 +0000 UTC

热门标签

javascript python java php c# c++ html android jquery mysql

Explore

  • 主页
  • 问题
    • 热门问题
    • 最新问题
  • 标签
  • 帮助

Footer

RError.com

关于我们

  • 关于我们
  • 联系我们

Legal Stuff

  • Privacy Policy

帮助

© 2023 RError.com All Rights Reserve   沪ICP备12040472号-5