mySQL: mysqlimport для импорта файла с разделителями-запятыми - первый столбец = ID, который НЕ находится в импортируемом файле - PullRequest
1 голос
/ 22 марта 2011

Привет, народ. Я пытаюсь импортировать очень большой файл, в котором ежедневно регистрируются данные о влажности для 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 содержит время, которое появляется как чч: мм: сс AM (или PM). Я хочу импортировать только чч: мм: сс и пропустить, будь то AM или (PM).

В любом случае файл, который я хочу импортировать, имеет столбцы SIX:

дата, время, открытие, максимум, минимум, закрытие.

Я хочу убедиться, что импортируемые данные имеют правильный city_ID, установленный в соответствии с city_ID в таблице 'cityname'. Так, например:

city_ID city_name
20      Boston 
19      Atlanta

Поэтому, когда данные влажности для Бостона импортируются в таблицу citymoisture, столбец city_ID устанавливается на 20. Аналогично, когда данные для Атланты импортируются в таблицу citymoisture, столбец city_ID устанавливается на 19. Таблица citymoisture будет очень большой и будет хранить данные о влажности за 1 минуту для 20 городов в будущем.

Итак, мои вопросы:

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  
.  
.  
.  

Я не уверен, как будет установлен city_ID в таблице citymoisture. Но если бы был способ сделать это, то я мог бы выполнить запросы на соединение, основанные на обеих таблицах, то есть на одну дату / время приходится одна запись на город.

1 Ответ

1 голос
/ 22 марта 2011

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');

Оставлять часть времени после полудня просто кажется плохой идеей.

...