【问题标题】:Trying to import a CSV file into a database in Postgres on Linux(Ubuntu 20.04)尝试将 CSV 文件导入 Linux 上 Postgres 中的数据库(Ubuntu 20.04)
【发布时间】:2022-01-27 09:04:01
【问题描述】:

使用 Linux 命令 df -Ph > metric.csv 创建此输出:

Filesystem      Size  Used Avail Use% Mounted on
udev            3.9G     0  3.9G   0% /dev
tmpfs           786M  2.2M  783M   1% /run'''

我登录到 postgres 并创建表:

CREATE TABLE metric(filesystem varchar,size varchar,used 
    varchar,available varchar,use varchar,mounted_on varchar, PRIMARY 
    KEY(filesystem));

接下来我使用 COPY 命令将数据插入到这个表中:

COPY metrics (filesystem,size,used,available,use,mounted_on) FROM '/data/metric.csv' CSV HEADER DELIMITER ',';

我收到以下错误:

ERROR:  missing data for column "size"
CONTEXT:  COPY metrics, line 2: "udev            3.9G     0  3.9G   0% /dev"

如果我能提供任何帮助或建议来解决此问题,我将不胜感激,以便我可以将数据插入数据库。

【问题讨论】:

  • 嗯...仅仅因为您将其称为metric.csv 并不能使其成为 CSV 文件。您明确指定 , 作为分隔符,并且您的 df 输出中没有逗号; postgres 找不到 size (或任何其他列,就此而言)似乎是合乎逻辑的。

标签: linux postgresql postgresql-12


【解决方案1】:

你可能想试试这个:

df -Ph | awk 'BEGIN{OFS=","}NR>1{$1=$1; print}' > metric.csv 

正如我在上面的评论中提到的,您的 csv 文件不是 csv。 awk 命令去掉了“标题”(我假设您希望在表格中摄取)并用 逗号替换 空格 >.

关于 awk - 语句的一些解释性词语。

BEGIN{} 部分中,处理发生在 awk 实际处理任何输入之前。我们在这里告诉 awk 使用 , 作为输出字段分隔符 (OFS)。默认情况下,awk 使用任意数量的连续空格

NR>1 告诉 awk 跳过第一行(NR == 记录数),从而省略标题。

{$1=$1;print} - 不幸的是,将第一个字段分配给自身对于 awk 处理该行是必要的; print 完全按照您的想法行事。

【讨论】:

  • @Zedu - 解释有帮助吗?
猜你喜欢
  • 2013-07-02
  • 1970-01-01
  • 2020-04-26
  • 1970-01-01
  • 2016-12-30
  • 1970-01-01
  • 2011-09-26
  • 1970-01-01
  • 2017-11-15
相关资源
最近更新 更多