PHP 导出及导入CSV大文件

简介: 在百度查php导出excel资料的时候,无意间发现,还有php导出csv文件的功能。他们二者没有什么区别。具体看需求。但是要操作的文件特别大的时候,推荐使用csv。

在百度查php导出excel资料的时候,无意间发现,还有php导出csv文件的功能。

他们二者没有什么区别。具体看需求。

但是要操作的文件特别大的时候,推荐使用csv。

导出csv的时候,需要用到一些php原生函数。我百度了一下基本用法。附上链接

bash

复制代码

Fgetcsv()
参考:http://www.w3school.com.cn/php/func_filesystem_fgetcsv.asp

bash

复制代码

Fputcsv()
参考:http://www.w3school.com.cn/php/func_filesystem_fputcsv.asp
bash

复制代码

Fopen()
参考:http://www.w3school.com.cn/php/func_filesystem_fputcsv.asp
ruby

复制代码

Iconv()
参考:http://php.net/manual/fr/function.iconv.php

先是导出:两种方法:

使用 header

我这里使用的是thinkphp3.2框架

php

复制代码

/**
     * 导出csv
     */
      public function putCsv(){
        $tableheader = array('姓名', '性别', '年龄', '学院', '班级');
        $tablelength = count($tableheader);
        /*表格数据*/
        $data = M()->query("SELECT id,username,logtime,gid,ip FROM admin");
        /*输入到CSV文件 解决乱码问题*/
        $html = "xEFxBBxBF";
        /*输出表头*/
        foreach ($tableheader as $value) {
            $html .= $value . "  ,";
        }
        $html .= "
";
        /*输出内容*/
        foreach ($data as $value) {
            for ($i = 0; $i < $tablelength; $i++) {
                $html .= $value[$i] . "  ,";
            }
            $html .= $value['createtime'] . "  ,";
            $html .= "
";
        }
        /*输出CSV文件*/
        header("Content-type:text/csv");
        header("Content-Disposition:attachment; filename=全部数据.csv");
        echo $html;
        exit();
      }

使用上边那些函数:

php

复制代码

/**
     * 重写fputcsv方法,添加转码功能
     * @param $handle
     * @param array $fields
     * @param string $delimiter
     * @param string $enclosure
     * @param string $escape_char
     */
    function fputcsv2($handle, array $fields, $delimiter = ",", $enclosure = '"', $escape_char = "\") {
        foreach ($fields as $k => $v) {
            $fields[$k] = iconv("UTF-8", "GB2312//IGNORE", $v);  // 这里将UTF-8转为GB2312编码
        }
        fputcsv($handle, $fields, $delimiter, $enclosure, $escape_char);
    }
    /**
     * 导出csv
     */
    public function csv()
    {
        set_time_limit(0);
        ini_set('memory_limit', '128M');//设置文件最大限制
        $fileName = date('YmdHis', time());//文件名
        // 设置头部
        header('Content-Encoding: UTF-8');
        header("Content-type:application/vnd.ms-excel;charset=UTF-8");
        header('Content-Disposition: attachment;filename="' . $fileName . '.csv"');
        //注意,数据量在大的情况下。比如导出几十万到几百万,
        //会出现504 Gateway Time-out,请修改php.ini的max_execution_time参数
        //打开php标准输出流以写入追加的方式打开
        $fp = fopen('php://output', 'a');
        //设置标题
        $title = array('id', '编号', '姓名', '年龄');
        //注意这里是小写id,否则ID命名打开会提示Excel 已经检测到"xxx.xsl"是SYLK文件,但是不能将其加载: CSV 文或者XLS文件的前两个字符是大写字母"I","D"时,会发生此问题。
        foreach ($title as $key => $item){
            $title[$key] = iconv("UTF-8", "GB2312//IGNORE", $item);
        }
        fputcsv2($fp, $title);
        // 导出百万级别数据时才需要用到for循环
        //用fputcsv从数据库中导出1百万的数据,比如我们每次取1万条数据,分100步来执行
        //一次性读取1万条数据,也可以把$nums调小,$step相应增大。
        //$step = 100;
        //$nums = 10000;
        // for ($s = 1; $s <= $step; $s++) {
            // $start = ($s - 1) * $nums;
            $result = M()->query("SELECT id,username,logtime,gid FROM admin");
            foreach($result as $key=>$row){
                foreach ($row as $key => $item){
                    $row[$key] = iconv("UTF-8", "GBK", $item); //这里必须转码,不然会乱码
                }
                fputcsv($fp, $row);
            }
            //ob_flush();  //每1万条数据就刷新缓冲区
            //flush();
        // }
    }

使用 header 导出这个就没有可说的了。

重点说下下边这个。

上边我注释掉的所有代码都是有用的,当你导出的数据量特别大的时候。

上边的测试是以百万级别的。

具体的,上边都有注释。看不明白的,请在下方留言。

下边是导入:

php

复制代码

/**
     * 导入csv
     */
    public function incsv()
    {
        $data = $this->csv_get_lines('./uploads/csv/20181221090925.csv', 10, 0);
        echo "<pre>";
        var_dump($data);
           // 加下来是将返回数组的数据插入数据库。这部分不做测试。
    }
    /**
     * csv_get_lines 读取CSV文件中的某几行数据
     * @param $csvfile csv文件路径
     * @param $lines 读取行数
     * @param $offset 起始行数
     * @return array
     * */
    public function csv_get_lines($csvfile, $lines, $offset = 0)
    {
        if(!$fp = fopen($csvfile, 'r')) {
            return false;
        }
        $i = $j = 0;
        while (false !== ($line = fgets($fp))) {
            if($i++ < $offset) {
                continue;
            }
            break;
        }
        $data = array();
        while(($j++ < $lines) && !feof($fp)) {
            $info = fgetcsv($fp);
            foreach ($info as $key => $item){
                $info[$key] = iconv("GBK", "UTF-8", $item); //这里必须转码,不然会乱码
            }
            $data[] = $info;
        }
        fclose($fp);
        return $data;
}
导入这个着重说一下参数。

$lines 读取行数

$offset 起始行数

也就是说,从哪开始读取,读取到哪里你是可以控制的,这样方便了大文件的导出。

百万级的文件,分一百次导入,一次导入一万条。我觉得要比一次直接导入一百万条数据要好。

有好的建议,请在下方输入评论

欢迎访问个人博客guanchao.site

欢迎访问我的小程序:打开微信->发现->小程序->搜索“时间里的”

目录
相关文章
|
2月前
|
PHP
php常见问题,php.ini文件不存在或者找不到,mb_strlen()函数未定义系列问题,dll模块找不到的解决
本文介绍了解决PHP常见问题的步骤,包括定位和创建`php.ini`文件,以及解决`mb_strlen()`函数未定义和DLL模块加载错误的具体方法。
php常见问题,php.ini文件不存在或者找不到,mb_strlen()函数未定义系列问题,dll模块找不到的解决
|
5月前
|
存储 运维 Serverless
函数计算产品使用问题之在YAML文件中配置了环境变量,但在PHP代码中无法读取到这些环境变量,是什么原因
函数计算产品作为一种事件驱动的全托管计算服务,让用户能够专注于业务逻辑的编写,而无需关心底层服务器的管理与运维。你可以有效地利用函数计算产品来支撑各类应用场景,从简单的数据处理到复杂的业务逻辑,实现快速、高效、低成本的云上部署与运维。以下是一些关于使用函数计算产品的合集和要点,帮助你更好地理解和应用这一服务。
|
2月前
|
前端开发 PHP
php学习笔记-php文件表单上传-day06
本文介绍了PHP文件上传处理流程、预定义变量`$_FILES`的使用、文件上传状态代码以及文件上传实现函数。同时,通过一个文件上传的小例子,演示了文件上传表单的创建、文件上传表单处理的PHP页面编写以及运行测试输出。
php学习笔记-php文件表单上传-day06
|
2月前
|
缓存 监控 算法
分析慢日志文件来优化 PHP 脚本的性能
分析慢日志文件来优化 PHP 脚本的性能
|
2月前
进入靶场,出现一张照片,右击查看源代码,发现有一个注释的source.php文件
这段代码实现了一个网站上弹出的促销海报动画效果,包含一个关闭按钮。当促销海报弹出时,会在三秒后开始抖动一两下。海报使用固定定位居中显示,带有阴影和圆角,关闭按钮位于右上角。可以通过修改时间参数调整弹出时间。
19 0
|
3月前
|
存储 安全 数据库连接
php.ini 文件的用途是什么?
【8月更文挑战第29天】
69 1
|
3月前
|
PHP
PHP遍历文件并同步上传到服务器
在进行网站迁移时,由于原网站的图片文件过多,采用打包下载再上传的方式耗时过长,且尝试使用FTP工具从旧服务器传输至新服务器时失败。为解决此问题,特使用PHP编写了一款工具,该工具能扫描指定目录下的所有`.webp`图像文件,并将其上传至新的服务器,极大地提高了迁移效率。
103 16
|
3月前
|
Java 应用服务中间件 PHP
PHP——调用java文件中的方法
PHP——调用java文件中的方法
56 0
PHP——调用java文件中的方法
|
4月前
|
API PHP UED
​一个PHP文件实现联系表单自动发送邮件
使用PHP和AOKSend服务,可以创建一个联系表单,收集用户信息并自动发送邮件。HTML表单包含姓名、邮箱和消息字段。PHP文件`send_mail.php`处理表单提交,通过AOKSend的SMTP设置(如主机、端口、API密钥)使用PHPMailer发送邮件到指定地址。代码中还包括安全措施,如使用`htmlspecialchars`防止XSS攻击。这种方法增强了网站的用户沟通体验,并依赖AOKSend的稳定性和API进行高效邮件发送。
|
3月前
|
PHP
php怎么循环读取文件夹里的文件
`DirectoryIterator`类提供了一个接口来遍历文件系统目录。与 `glob`函数相比,使用 `DirectoryIterator`类可以获得更多文件属性信息,如文件大小、修改时间等,从而进行更复杂的文件处理操作。
37 0