php读取txt文件并将数据插入到数据库
今天测试一个功能,需要往数据库中插入一些原始数据,PM给了一个txt文件,如何快速的将这个txt文件的内容拆分为所要的数组,然后再插入到数据库中?
serial_number.txt的示例内容:
serial_number.txt:
DM00001A110116, SN00002A110116, AB00003A110116, PV00004A110116, OC00005A110116, IX00006A110116,
创建数据表:
createtableserial_number( idintprimarykeyauto_incrementnotnull, serial_numbervarchar(50)notnull )ENGINE=InnoDBDEFAULTCHARSET=utf8;
php代码如下:
$conn=mysql_connect('127.0.0.1','root','')ordie("Invalidquery:".mysql_error()); mysql_select_db('test',$conn)ordie("Invalidquery:".mysql_error()); $content=file_get_contents("serial_number.txt"); $contents=explode(",",$content);//explode()函数以","为标识符进行拆分 foreach($contentsas$k=>$v)//遍历循环 { $id=$k; $serial_number=$v; mysql_query("insertintoserial_number(`id`,`serial_number`) VALUES('$id','$serial_number')"); }
备注:方法有很多种,我这里是在拆分txt文件为数组后,然后遍历循环得到的数组,每循环一次,往数据库中插入一次。
再给大家分享一个支持大文件导入的
<?php /** *$splitChar字段分隔符 *$file数据文件文件名 *$table数据库表名 *$conn数据库连接 *$fields数据对应的列名 *$insertType插入操作类型,包括INSERT,REPLACE */ functionloadTxtDataIntoDatabase($splitChar,$file,$table,$conn,$fields=array(),$insertType='INSERT'){ if(empty($fields))$head="{$insertType}INTO`{$table}`VALUES('"; else$head="{$insertType}INTO`{$table}`(`".implode('`,`',$fields)."`)VALUES('";//数据头 $end="')"; $sqldata=trim(file_get_contents($file)); if(preg_replace('/\s*/i','',$splitChar)==''){ $splitChar='/(\w+)(\s+)/i'; $replace="$1','"; $specialFunc='preg_replace'; }else{ $splitChar=$splitChar; $replace="','"; $specialFunc='str_replace'; } //处理数据体,二者顺序不可换,否则空格或Tab分隔符时出错 $sqldata=preg_replace('/(\s*)(\n+)(\s*)/i','\'),(\'',$sqldata);//替换换行 $sqldata=$specialFunc($splitChar,$replace,$sqldata);//替换分隔符 $query=$head.$sqldata.$end;//数据拼接 if(mysql_query($query,$conn))returnarray(true); else{ returnarray(false,mysql_error($conn),mysql_errno($conn)); } } //调用示例1 require'db.php'; $splitChar='|';//竖线 $file='sqldata1.txt'; $fields=array('id','parentid','name'); $table='cengji'; $result=loadTxtDataIntoDatabase($splitChar,$file,$table,$conn,$fields); if(array_shift($result)){ echo'Success!<br/>'; }else{ echo'Failed!--Error:'.array_shift($result).'<br/>'; } /*sqldata1.txt 1|0|A 2|1|B 3|1|C 4|2|D --cengji CREATETABLE`cengji`( `id`int(11)NOTNULLAUTO_INCREMENT, `parentid`int(11)NOTNULL, `name`varchar(255)DEFAULTNULL, PRIMARYKEY(`id`), UNIQUEKEY`parentid_name_unique`(`parentid`,`name`)USINGBTREE )ENGINE=InnoDBAUTO_INCREMENT=1602DEFAULTCHARSET=utf8 */ //调用示例2 require'db.php'; $splitChar='';//空格 $file='sqldata2.txt'; $fields=array('id','make','model','year'); $table='cars'; $result=loadTxtDataIntoDatabase($splitChar,$file,$table,$conn,$fields); if(array_shift($result)){ echo'Success!<br/>'; }else{ echo'Failed!--Error:'.array_shift($result).'<br/>'; } /*sqldata2.txt 11AstonDB192009 12AstonDB292009 13AstonDB392009 --cars CREATETABLE`cars`( `id`int(11)NOTNULLAUTO_INCREMENT, `make`varchar(16)NOTNULL, `model`varchar(16)DEFAULTNULL, `year`varchar(16)DEFAULTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=14DEFAULTCHARSET=utf8 */ //调用示例3 require'db.php'; $splitChar='';//Tab $file='sqldata3.txt'; $fields=array('id','make','model','year'); $table='cars'; $insertType='REPLACE'; $result=loadTxtDataIntoDatabase($splitChar,$file,$table,$conn,$fields,$insertType); if(array_shift($result)){ echo'Success!<br/>'; }else{ echo'Failed!--Error:'.array_shift($result).'<br/>'; } /*sqldata3.txt 11AstonDB192009 12AstonDB292009 13AstonDB392009 */ //调用示例3 require'db.php'; $splitChar='';//Tab $file='sqldata3.txt'; $fields=array('id','value'); $table='notExist';//不存在表 $result=loadTxtDataIntoDatabase($splitChar,$file,$table,$conn,$fields); if(array_shift($result)){ echo'Success!<br/>'; }else{ echo'Failed!--Error:'.array_shift($result).'<br/>'; } //附:db.php /*//注释这一行可全部释放 ?> <?php static$connect=null; static$table='jilian'; if(!isset($connect)){ $connect=mysql_connect("localhost","root",""); if(!$connect){ $connect=mysql_connect("localhost","Zjmainstay",""); } if(!$connect){ die('Cannotconnecttodatabase.Fatalerrorhandleby/test/db.php'); } mysql_select_db("test",$connect); mysql_query("SETNAMESutf8",$connect); $conn=&$connect; $db=&$connect; } ?>
//*/
复制代码
--数据表结构:
--100000_insert,1000000_insert
CREATETABLE`100000_insert`( `id`int(11)NOTNULLAUTO_INCREMENT, `parentid`int(11)NOTNULL, `name`varchar(255)DEFAULTNULL, PRIMARYKEY(`id`) )ENGINE=InnoDBAUTO_INCREMENT=1DEFAULTCHARSET=utf8
100000(10万)行插入:Insert100000_line_datause2.5534288883209seconds
1000000(100万)行插入:Insert1000000_line_datause19.677318811417seconds
//可能报错:MySQLserverhasgoneaway
//解决:修改my.ini/my.cnf max_allowed_packet=20M