我有这样的.csv文件数据
Date,Name,Call Type,Number,Duration,Address,PostalCode,City,State,Country,Latitude,Longitude
"Sep-18-2013 01:53:45 PM","Unknown","outgoing call",'123456',"0 Secs","null","null","null","null","null",0.0,0.0,,,
"Sep-18-2013 01:54:14 PM","Unknown","outgoing call",'1234567890',"0 Secs","null","null","null","null","null",0.0,0.0,,,
"Sep-18-2013 01:54:37 PM","Unknown","outgoing call",'14772580369',"1 Secs","null","null","null","null","null",0.0,0.0,,,
我正在使用以下代码将数据插入数据库
$sql = "LOAD DATA INFILE `detection.csv`
INTO TABLE `calldetections`
FIELDS TERMINATED BY '".@mysql_escape_string(",").
"` OPTIONALLY ENCLOSED BY `".@mysql_escape_string("\"").
"` OPTIONALLY ENCLOSED BY `".@mysql_escape_string("\'").
"` ESCAPED BY `".@mysql_escape_string("\\").
"` LINES TERMINATED BY `".",,,\\r\\n".
"`IGNORE 1 LINES `"
."(`date`,`name`,`type`,`number`,`duration`,`addr`,`pin`,`city`,`state`,`country`,`lat`,`log`)";
$res = @mysql_query($con,$sql);
但是什么也没插入;错误在哪里?
如果echo($sql);
执行该操作,您会发现查询语法不正确,原因如下:
文件名应该用引号而不是反引号引起来,因为它是字符串文字而不是标识符。
绝对不需要调用mysql_escape_string()
在FIELDS TERMINATED BY
and ENCLOSED BY
和ESCAPED BY
子句中指定分隔符。
您过度使用了反引号。实际上,在您的情况下,由于没有使用保留字,因此请放弃所有保留字。它们只会增加混乱。
在CSV文件第一行的末尾,您 必须要 ,,,
使用它,因为将它们用作行定界符的一部分。如果您不这样做,则不仅会跳过第一行,还会跳过包含数据的第二行。
您不能ENCLOSED BY
多次使用子句。您必须以Number
不同的方式处理字段。
查看您不需要的示例行恕我直言ESCAPED BY
。但是,如果您觉得自己需要它,可以像这样使用它ESCAPED BY '\\'
。
话虽这么说,但句法正确的语句可能看起来像这样
LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY ',,,\r\n'
IGNORE 1 LINES
(date, name, type, number, duration, addr, pin, city, state, country, lat, log)
现在,恕我直言,您需要在加载它们时转换很多字段:
date
表中的datetime
数据类型为数据类型,则需要对其进行转换,否则会出现错误日期时间值不正确:行的“日期”列为“ 2013年9月18日01:53:45 PM”
您必须处理围绕Number
字段值的单个qoutes
你最有可能要更改"null"
字符串字面量实际NULL
为addr, pin, city, state, country
列
如果持续时间总是以秒为单位,则可以提取秒的整数值并将其存储在表中,以便以后可以轻松汇总持续时间值。
话虽这么说,该语句的有用版本应如下所示
LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '"'
LINES TERMINATED BY ',,,\r\n'
IGNORE 1 LINES
(@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
number = TRIM(BOTH '\'' FROM @number),
duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
addr = NULLIF(@addr, 'null'),
pin = NULLIF(@pin, 'null'),
city = NULLIF(@city, 'null'),
state = NULLIF(@state, 'null'),
country = NULLIF(@country, 'null')
以下是在我的机器上执行查询的结果
mysql>加载数据文件'/tmp/detection.csv'
->进入表呼叫检测
->以','结尾的字段
->可选用““''封闭
->以',,, \ n'结尾的行
->忽略1行
->(@日期,名称,类型,@编号,@持续时间,@ addr,@ pin,@ city,@ state,@ country,lat,log)
->设置日期= STR_TO_DATE(@date,'%b-%d-%Y%h:%i:%s%p'),
->数字= TRIM(都是'\''FROM @number),
->持续时间= 1 * TRIM(从@duration跟踪'Secs'),
-> addr = NULLIF(@addr,'null'),
->引脚= NULLIF(@pin,'null'),
->城市= NULLIF(@city,'null'),
->状态= NULLIF(@state,'null'),
->国家= NULLIF(@ country,'null');
查询正常,受影响的3行(0.00秒)
记录:3已删除:0跳过:0警告:0
mysql>从calldetections中选择*;
+ --------------------- + --------- + --------------- +- ------------ + ---------- + ------ + ------ + ------ + ----- -+ --------- + ------ + ------ +
| 日期| 名称| 类型 编号 持续时间 地址| 别针 城市| 州| 国家| lat | 日志|
+ --------------------- + --------- + --------------- +- ------------ + ---------- + ------ + ------ + ------ + ----- -+ --------- + ------ + ------ +
| 2013-09-18 13:53:45 | 未知 拨出电话| 123456 | 0 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 |
| 2013-09-18 13:54:14 | 未知 拨出电话| 1234567890 | 0 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 |
| 2013-09-18 13:54:37 | 未知 拨出电话| 14772580369 | 1 | NULL | NULL | NULL | NULL | NULL | 0.0 | 0.0 |
+ --------------------- + --------- + --------------- +- ------------ + ---------- + ------ + ------ + ------ + ----- -+ --------- + ------ + ------ +
设置3行(0.00秒)
最后在php中将查询字符串分配给$sql
变量应如下所示
$sql = "LOAD DATA INFILE 'detection.csv'
INTO TABLE calldetections
FIELDS TERMINATED BY ','
OPTIONALLY ENCLOSED BY '\"'
LINES TERMINATED BY ',,,\\r\\n'
IGNORE 1 LINES
(@date, name, type, @number, @duration, @addr, @pin, @city, @state, @country, lat, log)
SET date = STR_TO_DATE(@date, '%b-%d-%Y %h:%i:%s %p'),
number = TRIM(BOTH '\'' FROM @number),
duration = 1 * TRIM(TRAILING 'Secs' FROM @duration),
addr = NULLIF(@addr, 'null'),
pin = NULLIF(@pin, 'null'),
city = NULLIF(@city, 'null'),
state = NULLIF(@state, 'null'),
country = NULLIF(@country, 'null') ";
问题内容: 尝试从CSV导入数据时遇到了一些问题,但还有一些问题,我还没有解决。 首先,这是我的代码,可以帮助您更好地了解事物(将其整理一些,删除CSS和DB连接): 从本质上讲,这是我对各种方法进行多次尝试后发现的示例的改编。 我的CSV有两列数据,第一列是文本,第二列是整数数据库中的表也有两列,第一列称为“文本”,第二列为“数字” 所以我的问题是: 正在上传的文本只是在每个字段中显示为0,我不
本文向大家介绍php将csv文件导入到mysql数据库的方法,包括了php将csv文件导入到mysql数据库的方法的使用技巧和注意事项,需要的朋友参考一下 本文实例讲述了php将csv文件导入到mysql数据库的方法。分享给大家供大家参考。具体分析如下: 本程序实现数据导入原理是先把csv文件上传到服务器,然后再通过php的fopen与fgetcsv文件把数据保存到数组,然后再用while把数据一
问题内容: 我想通过可手动运行以更新数据的PHP脚本将表格从CSV文件导入SQLite DB。 以下是我要实现的目标的列表: 将旧表(称为“ produkte”)重命名为product-currentdate(或删除表) 然后从CSV文件导入文件(分隔并使用ISO 8859-1字符集/ CSV文件的第一行包含表标题) 将日期保存在表“产品”中 我发现了一个由于某种原因无法运行的脚本: 我希望有人知
问题内容: 在此问题的最后,最后的代码终于生效了! 尝试实现这一点使用PHP /MySQL导入CSV数据)。我一定快到了… notes1:我的$ sql直接来自复制/粘贴phpmyadmin(生成php代码),并且在phpmyadmin中运行得很好。 note2:如果我注释$ sql =“ DELETE FROM dbase”行,代码将正常运行(并且表已清除)。 因此,如果我知道我的sql是正确的
问题内容: 我有几个要导入到表中的CSV文件。它们都包含不同数量的列,因此每次导入期间都会缺少一些数据。我需要一个可以让我将哪个CSV列映射到哪个MySQL列的工具。看起来MySQL工作台无法做到这一点。我还能使用什么? 问题答案: MySQL具有LOAD DATA INFILE语法: 请参阅有关自定义数据处理的文档。
我用的是Oracle 10g,SQL Developer我想知道有没有办法从CSV文件导入数据,其中字段用','分隔,行用' \n '结束使用SQL查询我尝试了这个查询 < code >将文件“C:/tmp.csv”中的数据加载到表CSVTEST2字段终止于“,”行终止于“\n”忽略1行(ID,FIRSTNAME,LASTNAME,birth date); 但是它不起作用,我总是从sql开发人员那