【问题标题】:Inserting a CSV file into PostgreSQL table using bash script使用 bash 脚本将 CSV 文件插入 PostgreSQL 表
【发布时间】:2020-02-12 10:56:11
【问题描述】:

我正在尝试使用 bash 脚本将 CSV 文件插入到 PSQL 表中。我的第一个目标是解析 CSV 文件,然后逐行插入数据。 COPY 命令对我来说不方便。我使用了以下脚本,但它不起作用。

编辑:顺便说一句,我没有创建表。我应该吗?

#!/bin/sh             
    while IFS=, read col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12
    do
        echo "INSERT INTO table_name ("a", "b", "c", "d", "e", "f", "g", "h", "i", "j", "k", "l") VALUES ('$col1','$col2','$col3','$col4','$col5','$col6','$col7','$col8','$col9','$col10','$col11','$col12');"
    done < ppr.csv | sudo psql -U pg_user -d test;

【问题讨论】:

  • 您能否提供有关您的问题的更多信息?您说“它不起作用”,那么当它不起作用时会发生什么?你有什么错误吗?
  • 错误:字符 13 处不存在关系“表名”第 1 行:插入表名(a、b、c、d、e、f、g、h、i、j、k、l ) 价值观..
  • 尝试使用单引号作为字段名称或转义双引号。
  • @Poshi - 错误:单引号后字符 18 处的“'a'”或附近的语法错误。
  • 你应该转义内部双引号。

标签: bash postgresql shell csv insert


【解决方案1】:

你应该转义内部双引号:

#!/bin/sh             
while IFS=, read col1 col2 col3 col4 col5 col6 col7 col8 col9 col10 col11 col12
do
    echo "INSERT INTO table_name (\"a\", \"b\", \"c\", \"d\", \"e\", \"f\", \"g\", \"h\", \"i\", \"j\", \"k\", \"l\") VALUES ('$col1','$col2','$col3','$col4','$col5','$col6','$col7','$col8','$col9','$col10','$col11','$col12');"
done < ppr.csv | sudo psql -U pg_user -d test;

【讨论】:

  • 错误:关系“表名”不存在第 1 行:插入表名。我应该先创建表和列还是?
  • @Bertug 是的,你应该
  • 如果任何值包含单引号,您的解决方案将不起作用。此外,这不包括引用的字段。
【解决方案2】:

不要尝试用 bash 解析 CSV,这很难做到正确。

您应该使用file_fdw 在数据库中定义一个外部表。这允许您访问数据库中的数据,而无需实际加载它。在某种程度上,你将 PostgreSQL 变成了一个 CSV 解析器。

然后您可以像从普通表中一样从该外部表中进行选择,例如将其部分插入到适当的 PostgreSQL 表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-06
    • 1970-01-01
    • 2018-01-18
    相关资源
    最近更新 更多