【问题标题】:Import CSV to PostgreSQL programmatically以编程方式将 CSV 导入 PostgreSQL
【发布时间】:2017-07-18 13:07:12
【问题描述】:

我有一个包含 90 列的 csv,我需要将其作为表导入到我的 pgsql 数据库中(还有几个包含大量列的 csv 文件,我想应用此方法)。我的目标是避免使用 CREATE TABLE 查询手动指定 90 个单独的列。

表格中的列标题应与 csv 中的列标题保持一致,并且每一列都应作为精度为 2 个小数点的数字数据类型导入。

到目前为止,我遇到的唯一可以执行此操作的程序是pgfutter,我已成功安装它。但是,我要连接的数据库是 AWS 上的远程数据库,不清楚在哪里输入连接详细信息。另外,安装后,在请求帮助信息时出现错误:

$ ./pgfutter --help
-bash: ./pgfutter: Permission denied

任何人都可以建议pgfutter 中的解决方法或另一种方法将具有简单数字列的 csv 文件自动导入 PostgreSQL 吗?

【问题讨论】:

  • 我会检查pgfutter 的权限并确保它是可执行的。听起来那是你的拦路虎。 ls -l pgfutter 之类的东西应该向您显示权限(在左侧)。 chmod 命令可用于更改权限(请参阅man chmod)。
  • "我有一个包含 90 列的 csv,我需要将其作为一个表导入到我的 pgsql 数据库中" 一个 90 列的 SQL 表是一个设计得很糟糕的表,将工作的噩梦。您应该做一些工作来将 CSV 数据转换为更合理的数据。也许可以问这个。
  • 为什么它会自动成为一个设计不佳的表格,而不仅仅是一个包含许多不同变量的表格?
  • 表中的列不是“变量”。它们是表所代表的实体的属性。一个有 90 列的表通常表明该表没有正确规范化,实际上是结合了来自不同实体的信息。但我同意这个讨论与这个问题无关。

标签: postgresql csv


【解决方案1】:

编写一个从 CSV 文件的第一行构造 CREATE TABLE 语句的 shell 脚本很简单。

这是我的解决方案:

#!/bin/bash

# makes a CREATE TABLE statement out of the first line of a CSV file

# usage: mktab <tabname> <CSV file>

if [ -z "$2" -o -n "$3" ]; then
    echo "usage: mktab <tabname> <CSV file>" 1>&2
    exit 1
fi

IFS=,
first=1

echo -n "CREATE TABLE \"$1\" ("
for col in $(head -1 "$2"); do
    if [ $first -eq 1 ]; then
        first=0
    else
        echo -n ', '
    fi
    echo -n "\"$col\" numeric(10,2)"
done
echo ');'

exit 0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-11
    • 1970-01-01
    • 2011-05-28
    • 2012-08-14
    • 1970-01-01
    相关资源
    最近更新 更多