在Windows 7上的PostgreSql 10中执行命令后,“ *#”是什么意思?

时间:2018-07-12 16:20:53

标签: postgresql psql

我在Windows 7上通过命令行使用PostgreSQL。我想将不同CSV文件的内容导入到新创建的表中。

执行命令后,数据库名称显示如下:

database=#

现在看起来像 database*#执行后:

type directory/*.csv | psql -c 'COPY sch.trips(value1, value2) from stdin CSV HEADER';

*#是什么意思?

谢谢

1 个答案:

答案 0 :(得分:1)

此答案适用于Linux ,因此不能回答Windows的OP问题。无论如何,我都会把它留给以后遇到的任何人。


您不小心以type directory/*.csv开始了block commenttype并没有达到您的预期。从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

参考文献