3

我目前有大量 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

这对于导入记录来说非常快——我有大约 50m 的空间要导入,因此读取每一行并不是一个好的选择。

4

2 回答 2

2

我不知道你是如何导入 CSV 的,但我会做的是编写一个脚本 (php/perl) 来读取每个文件,将时间戳四舍五入或修剪到秒,然后在 DATABASE 上执行 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);
?>

从命令行执行它,它应该可以完成这项工作

于 2011-10-26T14:45:31.593 回答
0

使用毫秒时它不会导入,但没有导入。所以你必须以一种或另一种方式子串。MySQL 有各种字符串函数,例如 SUBSTRING - 您可以使用它,因为您每次都需要在完全相同的位置削减这些毫秒。

但是,您将在执行查询时使用它。如果您无法修改查询,因为它以某种方式自动化,您可以在流程中添加一个步骤并首先更改数据,然后将其添加到您的数据库中。一个简单的脚本将能够读取 csv、对其进行更改、再次将其写回或直接执行查询。

于 2011-10-26T14:47:14.523 回答