表列:
col1, col2, col3, fname, lname
CSV 文件包含以下值:
col1,col2,col3
val1,val2,val3
val1,val2,val3
我想col1,col2,col3,fname,lname
使用 postgres 的 COPY 功能添加来自 csv 的数据以及其他数据,即在表中。
这可以使用 COPY 完成吗?如果不是,请建议解决方法。
表列:
col1, col2, col3, fname, lname
CSV 文件包含以下值:
col1,col2,col3
val1,val2,val3
val1,val2,val3
我想col1,col2,col3,fname,lname
使用 postgres 的 COPY 功能添加来自 csv 的数据以及其他数据,即在表中。
这可以使用 COPY 完成吗?如果不是,请建议解决方法。
psql \COPY 支持从程序输出读取。我们可以使用 cat 和 sed 即时修改文件:
'cat myFile | sed \'s/$/;col1;col2/\''
copy
您可以在命令中指定列列表:
copy YourTable(col1,col2,col3)
from '/home/you/yourfile.csv'
delimiter ','
csv header;
该header
选项告诉copy
忽略第一行。
我正在使用以下解决方法,我创建了一个 shell 脚本来为 CSV 文件中的其他列值添加前缀。
additional_cols="Fred,Solo";#fname,lname
csv_file="filename.csv";
sed -i -e "s/^/$additional_cols\,/" $csv_file
一旦文件被编辑,它很容易使用COPY
postgres 导入值。使用文档链接。COPY
您可以创建一个临时表,对其进行修改,然后复制回真正的目标表:
# create a temp table with the same structure as dest table, and drop it on commit
CREATE TEMPORARY TABLE temp_dest ON COMMIT DROP AS TABLE dest_table WITH NO DATA;"
COPY temp_dest(col1,col2 ...) FROM '/file/to/data.COPY'
# Do update in temp_dest, only affect the data just copied
UPDATE temp_dest set col_x=x where ...
INSERT INTO dest_table SELECT * FROM temp_dest