我在Windows 7上通过命令行使用PostgreSQL。我想将不同CSV文件的内容导入到新创建的表中。
执行命令后,数据库名称显示如下:
database=#
现在看起来像
database*#
执行后:
type directory/*.csv | psql -c 'COPY sch.trips(value1, value2) from stdin CSV HEADER';
*#是什么意思?
谢谢
答案 0 :(得分:1)
此答案适用于Linux ,因此不能回答Windows的OP问题。无论如何,我都会把它留给以后遇到的任何人。
您不小心以type directory/*.csv
开始了block comment。 type
并没有达到您的预期。从bash
内置文件中:
不带任何选项,指明如果用作命令名称,每个名称将如何解释。
尝试改用cat
:
cat directory/*.csv | psql -c 'COPY sch.trips(value1, value2) from stdin CSV HEADER';
如果由于每个CSV都有自己的标头而给您带来了问题,您也可以这样做:
for file in directory/*.csv; do cat "$file" | psql -c 'COPY sch.trips(value1, value2) from stdin CSV HEADER'; done
Bash中的type
内置命令是查看命令解释器结果的一种方式。例如,将其与ssh
一起使用:
$ type ssh
ssh is /usr/bin/ssh
这表示当在当前Bash环境中将ssh
作为命令运行时如何解释ssh
。这对于诸如别名之类的东西很有用。例如,ll
通常是ls -l
的别名。这是我的Bash环境为ll
所拥有的:
$ type ll
ll is aliased to `ls -l --color=auto'
对于您来说,当将此命令的结果传递给psql
时,它在输入中遇到/*
并假定它是一个块注释,这就是database*#
提示的含义(*
表示它正在等待评论关闭模式*/
)。
cat
用于将多个文件连接在一起。默认情况下,它会写入标准输出,因此cat directory/*.csv
会将每个CSV文件一个接一个地写入标准输出。但是,通过管道传输意味着每个CSV的标头也将通过管道传输到副本的中间。这可能不是理想的,所以:
我们可以使用for
遍历每个文件并分别导入。我上面的版本for file in directory/*.csv
将正确处理带空格的文件。格式正确:
for file in directory/*; do
cat "$file" | psql -c 'COPY sch.trips(value1, value2) from stdin CSV HEADER'
done
type
built-in Manual page(mankier.com)cat
Manual page(mankier.com)