我想使用路径将CSV
个文件中的数据插入PostgreSQL tables
。
文件名是filename.csv
;表的名称是filename
。
如何删除路径的其他部分以及.csv
扩展名?
我使用以下代码但不起作用:
for i in 'ls ~/catalog/subcatalog/*.csv' ; do
FILE = 'sed 's%~/catalog/subcatalog/%%g' $i'
PGPASSWORD=$2 psql -q -U $1 -d testing -c "copy 'sed 's%.csv%%g' $FILE from $i delimiter ',' CSV'";
done
答案 0 :(得分:1)
You shouldn't parse ls
输出。你可以在任何shell中执行此操作:
for path in ~/catalog/subcatalog/*.csv
do
You can't put spaces around an equals sign for assignment:
file='sed 's%~/catalog/subcatalog/%%g' $path'
要将变量分配给命令的值,请使用command substitution:
file="$(sed 's%~/catalog/subcatalog/%%g' "$path")"
但是有一种更简单的方法可以获得所谓的文件基本名称(即除了主要目录之外的所有内容):
file="$(basename "$path")"
您需要Use More Quotes™以避免出现像“空格”这样的“特殊”字符的问题:
PGPASSWORD="$2" psql -q -U "$1" -d testing -c [...]
PostgreSQL命令我不确定,但如果您发现特定命令不起作用,您可能只想问另一个问题。
答案 1 :(得分:0)
您的代码不起作用,因为sed
对文件或流进行操作,而不是对变量进行操作。但是你不需要sed
:
FILE=${i%.csv}
FILE=${FILE##*/}
这应该从.csv
中删除$i
扩展名并将结果存储在$FILE
中,然后删除目录部分。您可以直接在终端中尝试以上内容来验证结果。
答案 2 :(得分:0)
您可以这样使用basename:
...
FILE=`basename $i .csv`
...