2

我正在尝试将数据从 csv 文件导入 postgresql,不幸的是它的格式不完美。

例子:

DATE,TIME,NUMERIC,NUMERIC,NUMERIC,NUMERIC,INTEGER

我想将数据导入到包含列的表中:

timestamp with timezone, numeric, numeric, numeric, numeric, integer

为了导入我使用副本的数据:

COPY tabledata FROM 'c:\Users\Public\Downloads\test.csv' DELIMITERS ',' CSV;

当然它不起作用,因为日期和时间用''分隔,所以postgresql假定它们是2个独立的数据字段。

我已经设法将.csv导入到一个像.csv一样设置的表中,但是我需要稍后将日期和时间作为带有时区的时间戳,因为我将在导入后处理大量数据由于性能问题,转换将是我的最后选择。

我尝试在导入之前使用“sed 's/,/ /' EURUSD30.csv > EURUSD30E.csv”编辑 .csv 文件,但是我收到一条错误消息,指出命令“'s/”输入错误或可能找不到。我很无知,因为这似乎对其他人有用,但这也不是我的第一选择。

如果在导入时可以简单地告诉 postgresql 将时间和日期合并为一个时间戳值,那将更容易。有任何想法吗?

谢谢

4

1 回答 1

4

你最好的选择是COPY将数据放到一个TEMPORARYUNLOGGED表中,然后从那里做一个:

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'

或时间戳的本地时区是什么。

于 2012-10-02T13:36:37.913 回答