gpt4 book ai didi

postgresql - 在 Windows 7 上的 PostgreSql 10 中执行命令后, "*#"意味着什么?

转载 作者:行者123 更新时间:2023-11-29 13:14:06 25 4
gpt4 key购买 nike

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

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

database=#

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

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

*#是什么意思?

谢谢

最佳答案

此答案适用于 Linux,因此不会回答 OP 针对 Windows 的问题。无论如何,我会把它留给将来遇到这个问题的任何人。


您不小心启动了一个 block comment使用您的 type directory/*.csvtype 并不像您想象的那样。来自 bash 内置函数:

With no options, indicate how each name would be interpreted if used as a command name.

尝试使用 cat 代替:

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

如果因为每个 CSV 都有自己的 header 而给您带来问题,您还可以:

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 时,它会在输入中遇到 /* 并假定它是一个 block 注释,这就是database*#提示符的意思(*表示正在等待注释关闭模式,*/)。

猫命令

cat 用于将多个文件连接在一起。默认情况下,它写入标准输出,因此 cat directory/*.csv 会将每个 CSV 文件一个接一个地写入标准输出。但是,通过管道传输这意味着每个 CSV 的 header 也将在副本的中途通过管道传输。这可能是不可取的,因此:

For循环

我们可以使用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

引用资料

关于postgresql - 在 Windows 7 上的 PostgreSql 10 中执行命令后, "*#"意味着什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51310431/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com