phpmysql导出千万级csv最快方法

phpmysql导出千万级csv最快方法,第1张

1、首先创建要插入100万数据的表格,随机产生数字。

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>"

?>


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/6217080.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-03-18
下一篇 2023-03-18

发表评论

登录后才能评论

评论列表(0条)

保存