我正在尝试将大约100个CSV复制到PostgreSQL数据库中。 CSV并不是完美的数据库形成的,所以我必须进行一些编辑,我正在尝试用管道进行动态操作。
因为每个CSV文件都有一个标题,我需要删除第一行,以防止标题作为实体复制到数据库中。
我对此的尝试如下:
SELECT GROUP_CONCAT(CASE WHEN COLUMN_NAME = 'col1' THEN TABLE_NAME END) as `col1`,
GROUP_CONCAT(CASE WHEN COLUMN_NAME = 'col2' THEN TABLE_NAME END) as `col2`,
GROUP_CONCAT(CASE WHEN COLUMN_NAME = 'col3' THEN TABLE_NAME END) as `col3`
FROM
INFORMATION_SCHEMA.COLUMNS
where TABLE_NAME like "myView%";
我遇到的问题是,它将sed -e "s:\.00::g" -e "s/\"\"//g" *.csv | tail -n +2 | cut -d "," -f1-109 |
psql -d intelliflight_pg -U intelliflight -c "\COPY flights FROM stdin WITH DELIMITER ',' CSV"
视为单个文件,只删除它看到的第一个文件的第一行,并保留其余文件。< / p>
如何删除*.csv
通配符检索到的每个单独文件的第一行?
答案 0 :(得分:2)
您可以合并sed和tail
步骤,并使用find
进行每个文件的处理,然后将其输出传递给cut
和psql
:
find -name '*.csv' -exec sed '1d;s/\.00//g;s/""//g' {} \; | cut ...
这使用sed从每个文件中删除第一行,然后对其余文件进行替换。处理完每个文件,并将其输出全部传送到cut
和其他命令。
注意sed参数周围的单引号,用引号简化了一些事情。
这也处理子目录中的.csv
个文件;如果你不想这样,你必须用
find -maxdepth 1 -name etc.
答案 1 :(得分:2)
目前无法测试,但应该这样做:
awk -F, '
FNR == 1 {next}
{
gsub(/\.00/, "")
gsub(/""/, "")
NF = 109
print
}
' *.csv | psql ..
NF= 109
行将在109后删除任何字段。