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
无关;这是一个好主意。