嗨伙计我正在尝试导入一个非常大的文件,该文件每分钟每天记录一次,用于美国20个城市。
我有1个名为“cityname”的表,此表有2列:
-city_ID <- INT and is the primary key which increments automatically
-city_name <- character
我创建了另一个名为“citymoisture”的表,该表有7列:
-city_ID <- INT and is the primary key but does NOT increment automatically
-date_holding VARCHAR(30)
-time_holding VARCHAR(30)
-open
-high
-low
-close
date_holding意味着存放日期数据,但因为格式不是mysql所期望的(即它是m / d / y)我想最初将它存储在这个列中,然后再转换它(除非有办法在导入数据时转换它???)。类似地,time_holding列保持显示为hh:mm:ss AM(或PM)的时间。我只想导入hh:mm:ss并忽略它是AM还是(PM)。
在任何情况下,我要导入的文件都有SIX列:
日期,时间,开放,高,低,关闭。
我想确保导入的数据设置正确的city_ID,以匹配“cityname”表中的city_ID。例如:
city_ID city_name
20 Boston
19 Atlanta
因此,当波士顿的水分数据导入citymoisture表时,city_ID列设置为20.同样,当亚特兰大的数据导入citymoisture表时,city_ID列设置为19. citymoisture表将非常大,并将存储未来20个城市的1分钟水分数据。
所以我的问题是:
1)有没有办法将文件内容导入2-7列并手动指定第一列(city_ID)的值?
2)我在导入时动态转换日期的方法,或者我必须首先存储数据,然后转换并存储到最后的表格。
3)与#2相同的问题,但时间列。
非常感谢你的帮助。
水分数据文件的样本如下所示:
1/4/1999,9:31:00 AM,0.36,0.43,0.23,0.39
1/4/1999,9:32:00 AM,0.39,0.49,0.39,0.43
.
.
.
我不确定citymoisture表中的city_ID是如何设置的。但如果有办法,那么我可以根据两个表运行连接查询,即每个城市每个日期/时间有一条记录。
答案 0 :(得分:1)
STR_TO_DATE
应该可以用来获取您的日期和时间
mysql> SELECT STR_TO_DATE('01/01/2001', '%m/%d/%Y');
+---------------------------------------+
| STR_TO_DATE('01/01/2001', '%m/%d/%Y') |
+---------------------------------------+
| 2001-01-01 |
+---------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT STR_TO_DATE('10:53:11 AM','%h:%i:%s %p');
+------------------------------------------+
| STR_TO_DATE('10:53:11 AM','%h:%i:%s %p') |
+------------------------------------------+
| 10:53:11 |
+------------------------------------------+
1 row in set (0.00 sec)
mysql>
如何“手动”确定每行数据属于哪个城市?是否可以包含导入数据文件的示例行?假设你有某个city_ID,(在下面的代码中替换):
看起来你想要使用它:LOAD DATA INFILE
如果您要插入数据的城市是来自名为“Boston.dat”的文件的波士顿,并且您的城市名称表中存在条目:
SET @c_name = 'Boston';
SET @filename = CONCAT(@c_name,'.dat');
LOAD DATA INFILE @filename
INTO TABLE city_moisture
(@date, @time, open, high, low, close)
SET city_ID=(SELECT city_ID FROM TABLE cityname WHERE city_name=@c_name),
date=STR_TO_DATE(@date, '%m/%d/%Y'),
time=STR_TO_DATE(@time, '%H:%i:%s %p');
离开AM PM部分时间听起来不错。