【问题标题】:How do I import 101 CSV files at once into my PostgreSQL database?如何一次将 101 个 CSV 文件导入我的 PostgreSQL 数据库?
【发布时间】:2018-11-07 04:43:54
【问题描述】:

我在我的 MacOS 终端上设置了 psql。它连接到我通过 Amazon RDS 运行的 PostgreSQL 数据库。

我有 100 个 CSV 文件(名称为 1、2、3、4,最多 100 个)。我想批量导入它们。我看到有一些脚本 (https://dba.stackexchange.com/questions/168861/import-100-csv-files-into-postgresql/169089#169089),但我不知道如何运行脚本。

我尝试复制和粘贴此脚本 -

for x in $(ls <folder_name>*.csv); 
do psql -c "copy table_name from '$x' csv" also; done

我收到了这些错误 -

db=> for x in $(ls <folder_name>*.csv); 
ERROR:  syntax error at or near "for"
LINE 1: for x in $(ls <folder_name>...
        ^
db=> do psql -c "copy <table_name> from '$x' csv" also; done
ERROR:  syntax error at or near "psql"
LINE 1: do psql -c "copy <table_name> from '$x' csv" also;

你能帮我 a) 找出正确的脚本来批量导入这些文件 b) 找出如何执行脚本吗?

注意 - 所有文件都将转到同一个表,该表已经存在。

【问题讨论】:

  • 这是一个 shell 脚本而不是 plpgsql 脚本。你试过从 shell 运行吗?
  • 我从终端窗口运行它。我的印象是终端窗口是shell。准确吗?
  • 在我访问 psql 之前,我发现 shell 是终端窗口。

标签: database postgresql csv file-upload psql


【解决方案1】:

考虑到这张表:

CREATE TABLE t (id INT,description TEXT);

还有以下文件

file1.csv

id,description 
1,foo

file2.csv

id,description
2,bar

执行以下shell脚本:

#!/bin/bash
path="/home/user/files/"

for f in $path*.csv;do

    cat $f | psql testdb -c "COPY yourtable FROM STDIN DELIMITER ',' CSV HEADER"

done

你有你的数据:

$ psql testdb -c "SELECT * FROM t"
 id | description 
----+-------------
  1 | foo
  2 | bar
(2 Zeilen)

【讨论】:

  • 我在空白终端窗口(afaik 'shell')中试了一下,收到了这个错误 - psql: could not connect to server: No such file or directory 服务器是否在本地运行并接受连接在 Unix 域套接字“/tmp/.s.PGSQL.5432”上?
  • 您似乎无法通过psql 连接到服务器。数据库和psql在同一台机器上吗?
  • 只是为了说清楚:您必须将此代码保存到文本文件中并在终端中执行它,例如使用./myfile.sh。如果您的文件不可执行,请使用chmod +x myfile.sh 授予其执行权限
  • 这是我的错误。我已经用 psql 登录命令替换了“yourserver”来访问我的数据库。较新的版本出现此错误 - /Users/One/Documents/import_script2.txt:第 6 行:在寻找匹配的“”时出现意外 EOF /Users/One/Documents/import_script2.txt:第 10 行:语法错误:意外结束文件
  • 您是否可以在您的问题中添加这些 CSV 文件的样本?只是为了确保问题不在于文件结构本身。
【解决方案2】:

如果您将所有内容加载到同一个表中并且可以排除标题,则一种选择是将它们连接到单个 csv 中。

bash-$ head -1 /folder_name/file1.csv > combined_file.csv

bash-$ cat folder_name/*.csv | grep -v 'headerpattern' >>combined_file.csv

postgres# COPY yourtable FROM 'combined_file.csv' DELIMITER ','

【讨论】:

  • 如果每个 csv 文件都有自己的标题,这种方法可能会“失败”吗?
猜你喜欢
  • 2021-10-20
  • 2018-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
相关资源
最近更新 更多