使用包含毫秒的日期时间字段将CSV文件导入Postgres?

问题描述 投票:1回答:1

我需要将CSV文件导入Postgres(版本9.6.3),我需要帮助来了解执行此操作的最佳方法。

CSV的格式如下所示,并且了解实际导入文件的最佳方式,我也不确定我应该在表中用于存储'time'字段的数据类型,因为它包含毫秒并且是格式为'YYYY.MM.DD HH:MM:SS.MS'

Time,Col1,Col2,Col3,Col4
2017.05.01 00:00:02.851,1.09062,1.09057,4.35,5.42
2017.05.01 00:00:03.368,1.09062,1.09058,3.22,1
...

我有pgadmin客户端所以可以使用它,但我也愿意从命令行使用原始SQL或使用Python(Python 3.6)来创建表并导入数据。

我想要导入的文件大小从20mbs到数百mbs大小,所以我想找到最快的方法。

任何帮助或指针都非常感谢。

谢谢!

python sql postgresql csv import
1个回答
2
投票

您的表格可能如下所示(为列选择numeric types之一):

create table my_table(
    time timestamp, 
    col1 numeric, 
    col2 numeric, 
    col3 numeric, 
    col4 numeric);

使用copy command,例如:

copy my_table from '/data/my_file.csv' (format csv, header);

select * from my_table;

          time           |  col1   |  col2   | col3 | col4 
-------------------------+---------+---------+------+------
 2017-05-01 00:00:02.851 | 1.09062 | 1.09057 | 4.35 | 5.42
 2017-05-01 00:00:03.368 | 1.09062 | 1.09058 | 3.22 |    1
(2 rows)

如果文件非常大,您可以将其导入未记录的表,并在该alter table之后记录(请参阅alter table)。这可以减少导入的时间。

alter table my_table set unlogged;
copy my_table from '/data/my_file.csv' (format csv, header);
alter table my_table set logged;

拥有Postgres的操作系统用户必须具有该文件的读访问权限。


推荐问答