当前位置 : 主页 > 网络编程 > PHP >

PHP导入CSV文件

来源:互联网 收集:自由互联 发布时间:2021-06-28
PHP导入CSV文件 public function export_in_shebei_csv(){ //导入csv表 //p($_FILES); $filename = $_FILES['file']['tmp_name']; //接收上传的文件 if (empty ($filename)) {return '请选择要导入的CSV文件!'; } $handle = fopen($
PHP导入CSV文件
public function export_in_shebei_csv(){
    //导入csv表
    //p($_FILES);
    $filename = $_FILES['file']['tmp_name']; //接收上传的文件
    if (empty ($filename)) {return '请选择要导入的CSV文件!'; } 
    $handle = fopen($filename, 'r'); 
    //p($_FILES);
    $result = $this->input_csv($handle); //调用方法解析csv,返回
    fclose($handle); //关闭指针 
    //p($result);
    if(count($result)<1){return '没有任何数据!';} 
    
    //批量更新方法:replace into test_tbl (id,dr) values (1,'2'),(2,'3'),...(x,'y');
    $sql="replace into shebei ".$result['tit']." values ".$result['vStr'];
    //echo $sql;
    Db::execute($sql);
    go(__ROOT__.'/jk');
}
public function input_csv($handle){
    $out = array (); 
    //第1行是标题,标题是字段的注释,要换成字段名,但第一行必须读取,让指针下移一行。
    $lsarr=fgetcsv($handle, 10000);//读取第1行中的第1个值以获取其字符集(一维索引数组)
    //p($lsarr);
    $encode = mb_detect_encoding($lsarr[0], array("ASCII",'UTF-8',"GB2312","GBK",'BIG5'));//检测当前字符集
    
    //$sqlstr="select COLUMN_NAME,column_comment from INFORMATION_SCHEMA.Columns where table_name='shebei' and table_schema='viedonet'";
    //是一个二维数组,一维索引,二维关联		
    $sqlstr="select COLUMN_NAME from INFORMATION_SCHEMA.Columns where table_name='shebei' and table_schema='viedonet'";
    $tit=Db::query($sqlstr);//返回的$tit是字段名数组,一维索引,二维关联
    if(count($lsarr) != count($tit))return $out;//如果导入表中的字段数量与数据表中的字段数量不一致则中止导入
    unset($lsarr);//清除临时数组
    
    $intWord='id,kind_id,part_id';//手工指定的,是数据类型的字段名,不在此内的字段全用引号引起
    $intWordArr=array();//用来记录int类型的字段顺序
    //取得标题字符串,
    $title='';
    foreach ($tit as $k => $v) {
        $title.=$v['COLUMN_NAME'].',';
        if(preg_match('/'.$v['COLUMN_NAME'].'/', $intWord)){
            $intWordArr[]=true;
        }else{
            $intWordArr[]=false;
        }
    }
    $title='('.preg_replace('/,$/', '', $title).')';
    unset($tit);//清除临时数组
    
    //循环读取每一行数据组成数组
    $vStr='';
    while ($data = fgetcsv($handle, 10000)) { 
        if($data[0]=='')continue;//如果没有ID值则跳过本次循环,读下一行。
        //将每行数据用一个括号包起,每个括号间用逗号分隔。字符串要使用引号!
        $lsstr='';
        foreach ($data as $k => $v) {
            if($intWordArr[$k]){
                $lsstr.=iconv($encode, 'UTF-8', trim($v)).',';//数据字段,不加引号
            }else{
                $lsstr.='"'.iconv($encode, 'UTF-8', trim($v)).'",';//非数据字段,加引号
            }
        }
        $lsstr='('.preg_replace('/,$/', '', $lsstr).'),';//删除最后一个逗号
        $vStr.=$lsstr;
    }
    $vStr=preg_replace('/,$/', '', $vStr);//删除最后一个逗号
    $out['tit']=$title;
    $out['vStr']=$vStr;
    return $out; 
}
上一篇:PHP文件上传与下载
下一篇:PHP模拟telnet
网友评论