2、其次创建存储过程,并向表中插入数据,调用存储过程进行插入数据,插入300万条数据,且分几次插入。
3、最后导出数据到csv,使用函数selectxxxintooutfile,其中outfile后面的路径可以是Windows或macOS或者Linux。
这里的方法是利用fputcsv写CSV文件的方法,直接向浏览器输出Excel文件。复制代码
代码如下:
//
输出Excel文件头,可把user.csv换成你要的文件名
header('Content-Type:
application/vnd.ms-excel')
header('Content-Disposition:
attachmentfilename="user.csv"')
header('Cache-Control:
max-age=0')
//
从数据库中获取数据,为了节省内存,不要把数据一次性读到内存,从句柄中一行一行读即可
$sql
=
'select
*
from
tbl
where
……'
$stmt
=
$db->query($sql)
//
打开PHP文件句柄,php://output
表示直接输出到浏览器
$fp
=
fopen('php://output',
'a')
//
输出Excel列名信息
$head
=
array('姓名',
'性别',
'年龄',
'Email',
'电话',
'……')
foreach
($head
as
$i
=>
$v)
{
//
CSV的Excel支持GBK编码,一定要转换,否则乱码
$head[$i]
=
iconv('utf-8',
'gbk',
$v)
}
//
将数据通过fputcsv写到文件句柄
fputcsv($fp,
$head)
//
计数器
$cnt
=
0
//
每隔$limit行,刷新一下输出buffer,不要太大,也不要太小
$limit
=
100000
//
逐行取出数据,不浪费内存
while
($row
=
$stmt->fetch(Zend_Db::FETCH_NUM))
{
$cnt
++
if
($limit
==
$cnt)
{
//刷新一下输出buffer,防止由于数据过多造成问题
ob_flush()
flush()
$cnt
=
0
}
foreach
($row
as
$i
=>
$v)
{
$row[$i]
=
iconv('utf-8',
'gbk',
$v)
}
fputcsv($fp,
$row)
}
优点简单易用,非常节省内存,不依赖第三方类库。
<?include_once("include.php")
$card=445//接收$card
//英文字段转中文字段
function field_conv($en,$card){
global $DbUseDatabase,$DbMHost,$DbMUser,$DbMPass
$db = new newquery($DbUseDatabase,$DbMHost,$DbMUser,$DbMPass)
$db->query("select fieldname from t_cardinfo where cardkind=$card and field ='$en'")
if($db->next_record()){
return $db->f(0)
}
else
return false
}
function mysql_to_dbf($mysql_datasource,$source_table,$destination_dbf)
{
global $DbUseDatabase,$DbMHost,$DbMUser,$DbMPass,$card
$link=mysql_connect($DbMHost,$DbMUser,$DbMPass) or exit("不能链接到数据库")
$operate=mysql_select_db($mysql_datasource,$link)
//连mysql数据源
$rs=mysql_query("SELECT * from ".$source_table." limit 0,1")
$number_of_fields=mysql_num_fields($rs)//取字段数量
//不要前面5个底层字段
for($field_counter=5$field_counter<$number_of_fields$field_counter++)
{
$dbf_field_type=mysql_field_type($rs,$field_counter)
$dbf_field_name=mysql_field_name($rs,$field_counter)
$dbf_field_len=mysql_field_len($rs,$field_counter)
//print($dbf_field_name)
if(isset($point)){
unset($point)
array_pop($field)
}
switch($dbf_field_type)
{
case "string":
$dbf_field_name=substr(mysql_field_name($rs,$field_counter),0,10)
//自由表的字段名不能超过10,请注意
$dbf_field_len=mysql_field_len($rs,$field_counter)
if($dbf_field_len>=255)
{
$dbf_field_len--
}
$dbf_field_type="C"
break
case "varchar":
$dbf_field_name=substr(mysql_field_name($rs,$field_counter),0,10)
//自由表的字段名不能超过10,请注意
$dbf_field_len=mysql_field_len($rs,$field_counter)
if($dbf_field_len>=255)
{
$dbf_field_len--
}
$dbf_field_type="C"
break
case "decimal":
$dbf_field_name=substr(mysql_field_name($rs,$field_counter),0,10)
//自由表的字段名不能超过10,请注意
$dbf_field_len=mysql_field_len($rs,$field_counter)
if($dbf_field_len>=255)
{
$dbf_field_len--
}
$dbf_field_type="C"
break
case "real":
$dbf_field_name=substr(mysql_field_name($rs,$field_counter),0,10)
//自由表的字段名不能超过10,请注意
$dbf_field_len=mysql_field_len($rs,$field_counter)
if($dbf_field_len>=255)
{
$dbf_field_len--
}
$dbf_field_type="N"
$dbf_field_len="10"
$point="0"
break
case "date":
$dbf_field_type="D"
break
}
$fieldname=field_conv($dbf_field_name,$card)
$fieldname=subcnstr($fieldname, 9, '')//字段最长10个字符
$field[0]=$fieldname
$field[1]=$dbf_field_type
$field[2]=$dbf_field_len
if(isset($point)) {
$field[3]=$point
}
$dbf[]=$field
}
$d = array_map(null, $dbf)
if (!dbase_create($destination_dbf,$dbf)){
print "<strong>Error!</strong>"
exit
}
//else
// print "<strong>ok!</strong>"
//写入字段名完成!
$dbfp=dbase_open ($destination_dbf,2)
$rs=mysql_query("SELECT * from ".$source_table)
$field=mysql_num_fields($rs)
while($row = mysql_fetch_array($rs))
{
$i=0
for($fieldcounter=5$fieldcounter<$field$fieldcounter++)//不要前面5个底层字段
{
$field_name=mysql_field_name($rs,$fieldcounter)
$rows[$i]=$row[$field_name]
$i++
}
dbase_add_record ($dbfp,$rows)//写入记录
}
//print_r($dbffield)
dbase_close($dbfp)
mysql_close($link)
}
mysql_to_dbf("nbw1-SY","t_cardcontent445","c:\a.dbf")
echo "<script>alert('导出完成!')</script>"
?>
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)