将带有时间戳字段的CSV导入MonetDB

时间:2015-09-08 14:38:03

标签: csv timestamp etl monetdb

我将CSV导入MonetDB。我创建了一个名为fx的表:

CREATE TABLE fx(ticktime timestamp,broker varchar(6),pair varchar(10),side varchar(1),price float,size tinyint,level tinyint)

现在我正在尝试上传一个没有标题的大型CSV文件。

我的sample.csv:

 20150828 00:00:00.023,BRK1,EUR/USD,A,1.12437,1,1
 20150828 00:00:00.023,BRK1,EUR/USD,A,1.12439,5,2
 20150828 00:00:00.023,BRK1,EUR/USD,A,1.12441,9,3

我的命令:

sql>copy into fx from 'c:\fx\sample.csv' using delimiters ',','\n';
Failed to import table line 1 field 1 'timestamp(7)' expected in '20150828 00:00:00.023'

如何上传此csv?

1 个答案:

答案 0 :(得分:3)

文件中的时间戳格式不是MonetDB喜欢的格式。所以有两个选择:

1)将ticktime的类型更改为string

CREATE TABLE fx(ticktime string, broker varchar(6),pair varchar(10),side varchar(1),price float,size tinyint,level tinyint);
COPY INTO ...

但是,您需要使用字符串操作将字符串列ticktime转换为timestamp类型的新列ticktimet,例如:

ALTER TABLE fx add column ticktimet timestamp;
UPDATE fx SET ticktimet=str_to_timestamp(ticktime , '%Y%m%d %H:%M:%S');

请注意,此解决方案会从时间戳中丢弃亚秒部分(例如.023),因为str_to_timestamp目前不支持此功能。

2)更改CSV以使用MonetDB喜欢的日期格式,例如

2015-08-28 00:00:00.023,BRK1,EUR/USD,A,1.12437,1,1
2015-08-28 00:00:00.023,BRK1,EUR/USD,A,1.12439,5,2
2015-08-28 00:00:00.023,BRK1,EUR/USD,A,1.12441,9,3

然后,COPY INTO应该可以直接使用。