【问题标题】:Load .txt file into Postgres Database将 .txt 文件加载到 Postgres 数据库中
【发布时间】:2020-01-25 00:28:21
【问题描述】:

我创建了一个新的 Postgresql 表,但无法将 .txt 文件加载到该表中。我从文本文件中删除了标题并尝试加载数据但收到此错误:

错误:最后一个预期列 CONTEXT 之后的额外数据:复制 crd_codes1,第 1 行:“01 00 000 Alabama 1”SQL 状态:22P04

我在文本文件中包含了数据快照,以防万一。这是我在数据库中创建的空白表的代码:

CREATE TABLE CRD_codes1 
(state char(2), 
 crd char(2), 
 county char(3), 
 crd_name varchar(50), 
 history_flag char(1));

任何帮助将不胜感激!

【问题讨论】:

  • 那些是填充空格还是制表符?如果是空格,你可以转换为制表符,还是可以让文件为 CSV?
  • 如果是空格,这是固定宽度的数据...stackoverflow.com/questions/20873227/…

标签: sql postgresql copy load text-files


【解决方案1】:

欢迎来到 Stack Overflow。

如果您的列按选项卡拆分,请尝试以下操作:

COPY CRD_codes1 FROM '/home/jones/file.txt' CSV DELIMITER E'\t'
  • E'\t' 声明值由 TAB 拆分

但是,如果您的分隔符设置不正确,正如您的屏幕截图所示,您必须在插入表格之前清理此数据。以下脚本将数据导入临时表,替换多余的制表符并填充目标表。

CREATE TEMPORARY TABLE t (c TEXT);
COPY t FROM '/home/jones/file.txt' CSV ESCAPE E'\t';

WITH j AS (
  SELECT 
    string_to_array(
      regexp_replace(c, '\t+', ',', 'g'),
    ',') AS val 
  FROM t
) INSERT INTO CRD_codes1
SELECT j.val[1],j.val[2],j.val[3],j.val[4],j.val[5] FROM j;

SELECT * FROM CRD_codes1;

 state | crd | county |       crd_name        | history_flag 
-------+-----+--------+-----------------------+--------------
 01    | 10  | 077    | Lauderdale            | 1
 01    | 10  | 888    | D10 Combined Counties | 1
(2 Zeilen)

【讨论】:

  • 感谢这个代码 sn-p 提醒检查不规则间距(我没想到这样做)。由于 history_flag 字段的间距不规则,我在 Excel 中重新格式化了这些数据以使事情变得更容易/按时完成我的工作......我希望稍后再返回并自动化。在 Excel 中,由于前 4 个字段的记录是定期格式化的,因此我在这些字段上使用了“文本到列”(即基于最大单元格长度的固定宽度,格式 = TEXT)。然后,我分别处理了 history_flag 字段中的不规则间距,因为这些值跨越了多列(与其他数据字段分开)。
猜你喜欢
  • 1970-01-01
  • 2012-08-14
  • 2010-11-14
  • 1970-01-01
  • 2013-07-31
  • 2016-01-12
  • 2016-05-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多