2016-04-27 17:24:27 gxrj11 阅读数 934


 

 

 

由于经常需要导出数据给数据部门,刚开始时写程序来生成。发现又慢又麻烦,我就在想是否有办法在phpadmin中导出指定的数据呢,仔细观察了一下发现还真是有这样的功能。

 

 

1、查询出指定的数据,在数据列表下有一个数据导出的链接

phpAdmin数据导出用法

2、直接即可导出指定的数据

2019-03-07 19:20:02 liuqun0319 阅读数 207
将对应的字段转化为汉字,如下代码
<?php
date_default_timezone_set('UTC');
include("./fcrm_shop_info_foraudit.php");
include("./userList.php");

$fp = fopen('./shop_export' . date('Y_m_d') . '.csv', "w+");

$header = array(
    'shopid',
    '门店名称',
    '机构名称',
    '签约渠道',
    '所属大区',
    '签约BD',
);
fputcsv($fp,$header);

$ChannelCode = array(
    'KA' => '大客户部',
    'BF' => '北京分公司',
    'SF' => '深圳分公司',
    'SH' => '上海分公司',
    'GF' => '广州分公司',
    'YP' => '沈阳盘古',
    'BO' => '博德',
    'NS' => '南京首屏',
    'WH' => '武汉百捷',
    'BD' => '仅英孚Home、汇众',
    'HP' => '河北盘古',
    'CP' => '长春盘古',
    'HS' => '杭州首屏',
    'BA' => '成都百都',
    'BN' => '福建百纳',
    'KC' => '山东开创',
    'QD' => '青岛商至信',
    'QS' => '天津企商',
    'JW' => '湖南竞网',
    'HN' => '河南锐之旗',
    'WR' => '重庆网润',
    'WX' => '安徽网新',
    'DL' => '大连龙采',
    'LC' => '黑龙江龙采',
    'JX' => '广西集翔',
    'QA' => 'QA测试',
    'SX' => '山西龙采',
    'GJ' => '宁波国技',
    'BU' => '江苏百拓',
    'SK' => '盐城思科',
    'YE' => '厦门易尔通',
    'CW' => '云南创网',
    'HB' => '江西华邦',
    'KQ' => '呼和浩特开企',
    'BT' => '台州百泰',
    'JS' => '金华激石',
    'QZ' => '青之峰',
    'WB' => '江苏网博',
    'WE' => '烟台文博',
    'ZX' => '山东中迅',
    'QF' => '河南青峰',
    'XW' => '海南鑫网',
    'YS' => '易森',
    'RY' => '热源口腔',
    'ZB' => '百度金融事业部',
    'DF' => '大连非常完美',
    'FJ' => '山东济南福君',
    'LQ' => '兰州前海普惠',
    'CQ' => '重庆前海普惠',
    'ZS' => '淄博盛仁',
    'HX' => '南京厚学',
    'YF' => '四川玉易凡',
    'KF' => '武汉快乐分享',
    'SB' => '烟威思博',
    'ZD' => '郑州大发',
    'PY' => '濮阳源始',
    'TR' => '重庆天火同仁',
    'ZJ' => '杭州筑家易',
    'HC' => '山西衡智传媒',
    'XB' => '校宝在线',
    'XF' => '西区分公司',
);
foreach ($fcrm_shop_info_foraudit as $row){
    $data['shop_id'] = $row['shop_id'];
    $data['shop_name'] = $row['shop_name'];
    $data['institution_name'] = $row['institution_name'];
    $data['channel_id'] = $ChannelCode[$row['channel_id']];
    $data['belong_area'] = $area[$row['channel_id']];
    $data['userid'] = $arrUser[$row['create_bd_ucid']]['username'];
    fputcsv($fp,$data);
}
fclose($fp);

2019-12-13 19:22:20 qq_35182128 阅读数 14
  1. 界面导出
  2. phpAdmin导出
  3. 命令行导出
    3.1 mysql工具-打开数据库目录—>打开data目录,向上bin/目录
    3.2 mysqlimpoer.exe导入,mysqldump.exe导出在这里插入图片描述
    3.3 win+R 打开搜索cmd,回车
    3.4 将该文可执行文件拖入命令行 -u 用户名 -p 数据库名 > 要导出的位置(可新建文件,也可拖入)
    在这里插入图片描述
    3.5 导出成功
    4.mysql命令行 source导入
    在这里插入图片描述
2014-03-17 16:58:46 cdy102688 阅读数 6649

背景:接手的项目中支持导出一批数据,全数量在50W左右。在接手的时候看代码是直接一次查询mysql获得数据,然后用header函数直接写入csv,用户开始导出则自动下载。但是,在全导出的时候,功能出现了BUG问题。

1.数据量大导致php处理脚本运行时间,超过默认限制。

2.数据量过大,导致内存溢出,流程中止。


初版解决方案:

1.通过函数set_time_limit(0);       取消执行时间限制(在导出的函数入口设置,这是合理的,导出的数据量过大了)

2.关于数据过大,内存溢出的解决办法,开始是想到了php动态变量(先由sql语句获得总记录数,然后每2W条切分,查询2w条数据存入一个变量)

	$total_export_count = $db->getOne("select count(1) from ($sql) t2");
		
	for ($i=0;$i<intval($total_export_count/20000)+1;$i++){
	        $export_data = "exportdata".$i;
    	    $$export_data = $db->getAll($sql." limit ".strval($i*20000).",20000");
    	}
然后通过相应的代码取出变量的信息,echo到csv文件中,这种方式在本地测试的时候是通过的,但在服务器上依旧会内存溢出。
	header ( "Content-type:application/vnd.ms-excel" );
    	header ( "Content-Disposition:filename=" . iconv ( "UTF-8", "GB18030", "查询用户列表" ) . ".csv" );	
    	$out = $column_name;
    	echo iconv ( "UTF-8", "GB18030", $out );
    	
    	for ($i=0;$i<intval($total_export_count/20000)+1;$i++){
    	    $dynamic_name = "exportdata".$i;
        	foreach ( $$dynamic_name as $key => $item ) {
        	    echo iconv ( "UTF-8", "GB18030", "\n".implode(',',$item) );
        	}
        	
        	// 将已经写到csv中的数据存储变量销毁,释放内存占用
            	unset($$dynamic_name);
    	}
    	
    	exit ();
因为上面的方法在服务器上没有通过,所以只能将分割数据量的操作放到写文件的流程中,相比上面的思路这种会慢一些。
    	header ( "Content-type:application/vnd.ms-excel" );
    	header ( "Content-Disposition:filename=" . iconv ( "UTF-8", "GB18030", "查询用户列表" ) . ".csv" );	
    	$out = $column_name;
    	echo iconv ( "UTF-8", "GB18030", $out );
    	
    	$pre_count = 20000;
    	for ($i=0;$i<intval($total_export_count/$pre_count)+1;$i++){
    	    $export_data = $db->getAll($sql." limit ".strval($i*$pre_count).",{$pre_count}");
        	foreach ( $export_data as $key => $item ) {
        	    echo iconv ( "UTF-8", "GB18030", "\n".implode(',',$item) );
        	}
        	
        	// 将已经写到csv中的数据存储变量销毁,释放内存占用
            unset($export_data);
    	}
    	
    	exit ();
经测试之后是可行的,服务器上也可以导出,就是时间会慢一些,而且会是一直下载状态。

关于这个场景整理了一些资料:

1.csv文件的条数是好像没有限制的,可以一直写(网上的博文里面看的,没证实过)

2.excel 2010版本以上,是可以读取100多W行数据的(验证过,新建一个excel,ctrl+下箭头  到文件末尾可以看到行数)


理想的解决方案(没有具体实施,想的)

1.数据分割肯定是必须的步骤,防止内存溢出。

2.将分割后的数据写入到一个excel或者一个csv文件中,被分割了多少次,写多少个文件。这样可以防止达到文件行数的最大限制。

3.将2中写的文件进行压缩处理,压缩成一个压缩包,然后进行自动下载。


补充:

在上面的方案正式运行的时候发现导出的数据,总是比查询的总记录数要少1000多条,几次看数据后发现有些数据并没有换行,而是写到上一行去了。在有了这个觉悟后,重新看了遍之前转别人的帖子,发现还是用fputcsv()函数比较靠谱,传入一个数组,作为一行的数据,由该函数自己去写换行和控列。感觉有些时候还是不要偷懒的好啊,虽然自己写","完成列分割,写"\n"完成空格,貌似是可行的,但是对于一些数据,并不一定能控制的好。


修改后的导出代码:

    	header ( "Content-type:application/vnd.ms-excel" );
    	header ( "Content-Disposition:filename=" . iconv ( "UTF-8", "GB18030", "query_user_info" ) . ".csv" );
    	
    	// 打开PHP文件句柄,php://output 表示直接输出到浏览器
    	$fp = fopen('php://output', 'a'); 
    	
    	// 将中文标题转换编码,否则乱码
    	foreach ($column_name as $i => $v) {  
            $column_name[$i] = iconv('utf-8', 'GB18030', $v);  
        }
        // 将标题名称通过fputcsv写到文件句柄  
        fputcsv($fp, $column_name);
    	
    	$pre_count = 10000;
    	for ($i=0;$i<intval($total_export_count/$pre_count)+1;$i++){
    	    $export_data = $db->getAll($sql." limit ".strval($i*$pre_count).",{$pre_count}");
        	foreach ( $export_data as $item ) {
        	    $rows = array();
        	    foreach ( $item as $export_obj){
        	        $rows[] = iconv('utf-8', 'GB18030', $export_obj);
        	    }
    	        fputcsv($fp, $rows);
        	}
        	
        	// 将已经写到csv中的数据存储变量销毁,释放内存占用
            unset($export_data);
            ob_flush();
            flush();
    	}
    	
    	exit ();

2018-10-19 09:27:19 liuqun0319 阅读数 295

修改mysql导入数据库文件最大限制的方法

遇到需要导入过大数据文件时,先检查php.ini?的upload_max_filesize,修改其值,并且推荐修改的值要稍大于导入的数据文件。重启php环境(即重启web服务器,我用的是Apache2.2就重启Apache,如果用的是IIS就重启IIS,以此类推),再次导入即可。导入建议使用 CSV using LOAD DATA 。

关于phpmyadmin导入csv,参数选项一些说明:

1、关于 CSV 和 CSV using LOAD DATA

这两种都可以导入CSV格式的文件数据,区别在于:当文件比较大时用 CSV 可能 script 会?时,这时就得使用 LOAD DATA。

2、列名

列名就是你在导出时打钩的“将字段名称放在首行”,实际就是用分隔符分开的字段名集合,就是填写所有字段名,中间用分隔字段的字符隔开。

3、Ignore duplicate rows

这个选项的作用是忽略相同的行,意为相同的行只导入一行数据。

4、转义字段的字符是指数据里面可能含有特殊字符串,如分隔字段的字符、包裹字段的字符还有SQL保留字符,这些得先转义否则会出错,按默认的设置是没什么问题的。

没有更多推荐了,返回首页