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