Импорт MySQL CSV — дата, введенная как 0000-00-00 00:00:00, если временная метка содержит миллисекунды?

#mysql #csv #mysqlimport

#mysql #csv #mysqlimport

Вопрос:

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

 2011-10-13 09:36:02.297000000
  

Я знаю об ошибке MySQL # 8523, которая указывает, что хранение миллисекунд в поле datetime не поддерживается. Несмотря на это, я ожидал, что поле 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 миллионов, поэтому чтение каждой строки — не лучший вариант.

Комментарии:

1. как вы импортируете CSV?

2. Я обновил вопрос, включив команду импорта.

Ответ №1:

Я не знаю, как вы импортируете 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);
?>
  

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

Комментарии:

1. Я использую команду MySQLImport следующим образом: mysqlimport —поля-вложенные-по =»» —поля-завершенные-по =»»,» —строки-завершенные-по =»n» —столбцы= идентификатор,@x,Пара, Время -p —локальное усиление [файл].csv. У меня есть около 50 миллионов записей для импорта, поэтому чтение каждой строки на самом деле не вариант (mysqlimport работает очень быстро).

2. попробуйте использовать сценарий, подобный приведенному выше. Он должен обрезать строку «2011-10-13 09:36:02.297000000» до первых 19 символов, то есть «2011-10-13 09:36:02».

3. Я смог собрать все CSV вместе и запустить awk -F ',' '{print $1","$2","$3","substr($4,0,19)","$5","$6}' 2011octwk2.csv > TickPrices.csv — это сработало отлично, и потребовалось <10 минут для почти 50 миллионов записей.

Ответ №2:

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

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

Комментарии:

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