用Thinkphp上传导入csv文件并去除重复数据

时间:2024-05-21 09:25:58
        随着二胎政策的放开,中国的人口又一增高,数据也越来越多,那么数据的处理就尤为重要,在数据库中一条一条的添加很繁琐,批量的导入数据就显得很方便,导入并导入时,要记得编码格式要注意!那么实现此功能的思路大致如下:(附图)

  1.  先搭建好上传的界面
  2.  通过点击上传按钮,将所上传的表选中 
  3. 再进行导入
  4. 数据读取
  5. 依次将读取的数据存入数据库( 将数据进行筛选)
  6. 最后导入完毕下载日志文件供需要的用户 
        用Thinkphp上传导入csv文件并去除重复数据

         

代码展示如下:

//上传方法

 public function upload(){
if (IS_GET) {
$this->display();
exit();
}
$upload = new \Think\Upload();//实例化上传类
$upload->maxSize = 0;//设置上传文件大小
$upload->exts = array('csv');//设置上传文件类型
$upload->rootPath = './Public/Uploads/';//设置根目录
$upload->savePath = '';//设置子目录
//上传文件
$info = $upload->upload();//☆ 此处调用tp自带的upload()方法
if (!$info) {
$this->error($upload->getError());
}else{
$this->import($upload->rootPath . $info['file']['savepath'] . $info['file']['savename']);
}

}

//导入
public function import($file){
//检测文件编码
$encoding = detect_encoding($file);
//将格式转化为UTF8
if ($encoding != 'UTF-8') {
$contens = file_get_contents($file);//适合小文件
$contens = mb_convert_encoding($contens, 'utf-8',$encoding);
file_put_contents($file, $contens);
}
$fp = fopen($file,'r');
if ($fp) {
$fields = array('no','name','sex');
$model = M('form');
$arrNo =$model->getField('no',true);//获得学号
$arr = array();
while (($row = fgetcsv($fp,1000,","))!==false) {

$row = array_combine($fields,$row);//写入数据 

                                //此处过滤重复值。

                                //若数据库存在则continue;

                                // 若数据库中不存在就追加在上面查询的学号一维数组中 并继续执行程序且写入日志文件

if (in_array($row['no'],$arrNo)) {
// echo "已存在";
$file='./Public/demo.txt';
$str.=$row['no']."已存在"."\r\n";
    file_put_contents($file, $str);
}else{ 
$arrNo[]=$row['no'];
$arr[]=$row;  
$file='./Public/demo.txt';
$str2.=$row['no']."导入成功"."\r\n";
    file_put_contents($file, $str2);
}
//批量写入addAll
if (count($arr)==1000) {
$model->addAll($arr);
unset($arr);
}

if (count($arr)>0) {
$model->addAll($arr);
}
$this->show('添加成功','utf8');
$this->xiazai();   
exit;
}
}
//下载日志文件

function xiazai(){

                $file_name ="demo.txt";    

$file_dir = "./Public/";          
//检查文件是否存在    
if (! file_exists ( $file_dir . $file_name )) {    
    echo "文件找不到";    
    exit ();    
} else {    
    //打开文件    
    $file = fopen ( $file_dir . $file_name, "r" );    
    //输入文件标签     
    Header ( "Content-type: application/octet-stream" );    
    Header ( "Accept-Ranges: bytes" );    
    Header ( "Accept-Length: " . filesize ( $file_dir . $file_name ) );    
    Header ( "Content-Disposition: attachment; filename=" . $file_name );    
    //输出文件内容     
    //读取文件内容并直接输出到浏览器    
    echo fread ( $file, filesize ( $file_dir . $file_name ) );    
    fclose ( $file );  
}  
}

        至此导入数据库就完成了!不过总感觉代码有瑕疵 ,每次执行while循环语句file_put_contents()此函数每每打开关闭,运行程序不仅繁琐还会占用时间,在写程序中这是忌讳的,望大家能提出一个好建议!