MySQL CSV Import - дата введена как 0000-00-00 00:00:00, если временная метка имеет миллисекунды? - PullRequest
3 голосов
/ 26 октября 2011

В настоящее время у меня есть большое количество CSV для импорта в базу данных MySQL.Файлы содержат метки времени для каждой записи в следующем формате (например):

2011-10-13 09:36:02.297000000

Мне известно об ошибке MySQL № 8523, которая указывает на то, что сохранение миллисекунд в поле даты и времени не поддерживается.Несмотря на это, я ожидал бы, что поле datetime будет усекать запись после секунд, вместо того, чтобы вводиться как пустое.

Я сузил проблему до миллисекунд (в отличие от форматирования csv и т. Д.), поскольку

2011-10-13 09:36:02

импортирует правильно.

Может ли кто-нибудь предложить способ импортирования этих данных без нулей?У меня слишком много CSV, чтобы войти в каждый из них вручную и отрегулировать длину / форматирование временных меток.

Я должен отметить, что хотя миллисекунды было бы неплохо, они не нужны для моего приложения,поэтому я был бы счастлив с решением, которое позволяет мне легко обрезать числа и импортировать их.

Спасибо!

РЕДАКТИРОВАТЬ: Чтобы уточнить, я импортирую CSV, используя следующую команду:

mysqlimport --fields-enclosed-by="" --fields-terminated-by="," --lines-terminated-by="\n" --columns=id,@x,Pair,Time -p --local gain [file].csv

Это очень быстро для импорта записей - у меня есть около 50 м для импорта, поэтому чтение каждой строки не является хорошим вариантом.

Ответы [ 2 ]

2 голосов
/ 26 октября 2011

Я не знаю, как вы импортируете файлы CSV, но я бы написал сценарий (php / perl) для чтения каждого файла, округления или сокращения метки времени до секунд и выполнения операторов INSERT наБАЗА ДАННЫХ.

Что-то вроде

<?php
$file=fopen("your.csv","r");
mysql_connect ($ip, $user, $pass);

while(!feof($file))
{
   $line = explode(',',fgets($file));
   mysql_query("INSERT INTO TABLE1 (ID, DATE) values (".$line[0].", ".substr($line[1],0,19).")");
}
fclose($file);
?>

Выполните это из командной строки, и оно должно выполнить работу

0 голосов
/ 26 октября 2011

Не будет импортироваться при использовании миллисекунд, но импортирует без. Таким образом, вы должны подстроку так или иначе. MySQL имеет различные строковые функции, такие как SUBSTRING, которые вы можете использовать, поскольку вам нужно каждый раз вырезать эти миллисекунды в одной и той же позиции.

Однако, это вы бы использовали при выполнении запроса. Если вы не можете изменить запрос, так как он каким-то образом автоматизирован, вы можете добавить шаг в процесс и сначала изменить данные, а затем добавить их в базу данных. Простой сценарий сможет прочитать CSV, изменить его, записать обратно или выполнить запрос напрямую.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...