PostgreSQL 9.5:跳过文本文件中的前两行

PostgreSQL 9.5:跳过文本文件中的前两行,postgresql,Postgresql,我有以下格式的文本文件要导入: columA | columnB | columnC ----------------------------------------- 1 | A | XYZ 2 | B | XZ 3 | C | YZ 我可以使用以下命令跳过第一行: WITH CSV HEADER; 在copy命令中,但在跳过第二行时被卡住。copy命

我有以下格式的文本文件要导入:

columA    | columnB    |    columnC
-----------------------------------------
1     |     A          |    XYZ
2     |     B          |    XZ
3     |     C          |    YZ
我可以使用以下命令跳过第一行:

WITH CSV HEADER; 

在copy命令中,但在跳过第二行时被卡住。

copy命令只能跳过第一行。最简单的解决方案是在导入前手动删除第二行,但如果不可能,则必须使用“脏”技巧


创建一个表,该表有一列
varchar
类型,并将文本文件导入该表。导入后,运行PL/pgSQL函数读取表中的所有行(显然,标题行除外),并提取要插入到目标表中的信息,例如使用
regexp\u matches()
regexp\u split\u to\u array()
函数。如果必须导入具有相同问题的多个文件,您还可以通过在导入表上使用“插入后”触发器来自动化整个过程。

如果您使用的是“从文件名复制”,您可以使用
COPY FROM PROGRAM
来调用一些shell命令,该命令从文件中删除头并返回其余部分

在Windows中:

COPY t FROM PROGRAM 'more +2 "C:\Path\To\File.txt"'
在Linux中:

COPY t FROM PROGRAM 'tail -n +3 /path/to/file.txt'
如果您试图将本地文件发送到远程服务器,可以通过
psql
执行类似操作,例如:

tail -n +3 file.txt | psql -c 'COPY t FROM STDIN'

从“文件”复制
,或
从STDIN复制
?@NickBarnes,
从文件复制
。下面是我正在使用的
从带有分隔符“|”CSV头的“X:\File.txt”复制数据_表哇!!非常感谢。这只有在服务器可以直接访问文件时才起作用。如果文件驻留在另一台计算机上(即通过psql或库/框架访问服务器的客户端),这将不起作用。@Patrick:谢谢,绝对值得一提。我添加了一个客户端psql示例。如果您正在通过客户端库运行
COPY FROM STDIN
,您可以在传入流之前自己设置流的位置。@Patrick有关于在psql中使用“tail”的文档吗?sql中的新程序。@thleo:
tail
psql
无关;这是一个好主意。