我正在尝试将数据从csv文件导入到postgresql中,遗憾的是它没有完美格式化。
示例:
DATE,TIME,NUMERIC,NUMERIC,NUMERIC,NUMERIC,INTEGER
我想将数据导入到包含以下列的表中:
timestamp with timezone, numeric, numeric, numeric, numeric, integer
为了导入数据,我使用copy:
COPY tabledata FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV;
当然它不起作用,因为日期和时间用','分隔,所以postgresql假定那些是2个独立的数据字段。
我已经设法将.csv导入到一个像.csv一样设置的表中,但是我需要将日期和时间作为时区的时间戳,以后我会处理大量的数据由于性能问题,导入后转换将是我的最后选择。
我尝试使用“sed's /,/ /'EURUSD30.csv> EURUSD30E.csv”导入之前编辑.csv文件但是我收到一个错误,说命令“'s /”是键入错误或无法找到。我很无能,因为这似乎适用于其他所有人,但这也不是我的首选。
如果在导入时简单地告诉postgresql将时间和日期合并到一个时间戳值中会更容易。有什么想法吗?
由于
答案 0 :(得分:4)
最好的办法是COPY
将数据发送到TEMPORARY
或UNLOGGED
表格,并从那里开始:
INSERT INTO real_table
SELECT col1, col2, col3, datecol + timecol, col6, ...
FROM temp_copy_table;
您也可以在该过程中进行任何其他所需的数据按摩。
合并时考虑时区。 DATE
+ TIME
生成timestamp without time zone
:
regress=# SELECT pg_typeof(DATE '2012-02-01' + TIME '10:00');
pg_typeof
-----------------------------
timestamp without time zone
(1 row)
并且您可能希望存储带时区的时间戳,因此您可能希望告诉Pg将日期+时间解释为在特定时区:
(datecol + timecol) AT TIME ZONE 'UTC'
或时间戳的当地时区。