大数据量csv格式php导入mysql有什么好的解决方案?

konio 2009-09-15 05:49:54
大数据量的csv格式,5-6万条数据
客户端 php导入mysql有什么好的解决方案?

目前的思路(手机号码管理)
1:客户浏览上传
2:读取上传缓存文件 $_FILES['csvfile']['tmp_name']
3:格式处理
4:判断是否存在手机号码
5:插入/更新数据库

目前写的文件更新个2000多条执行速度就卡卡的



// 批量上传商品的字段
$_LANG['upload_goods']['mobilenumber'] = '手机号码';
$_LANG['upload_goods']['name'] = '姓名';
$_LANG['upload_goods']['address'] = '属地'; // 需要转换成brand_id
$_LANG['upload_goods']['brand'] = '品牌';
$_LANG['upload_goods']['price'] = '金额';
$_LANG['upload_goods']['paytime'] = '缴费时间';

$_LANG['batch_upload_ok'] = '批量上传成功';
$_LANG['goods_upload_confirm'] = '批量上传确认';

$line_number = 0;
$goods_list = array();
$field_list = array_keys($_LANG['upload_goods']); // 字段列表
$data = file($_FILES['csvfile']['tmp_name']);

foreach ($data AS $line)
{
// 跳过第一行
if ($line_number == 0)
{
$line_number++;
continue;
}
$line = iconvs('gb2312', 'utf8', $line);
// 初始化
$arr = array();
$buff = '';
$quote = 0;
$len = strlen($line);
for ($i = 0; $i < $len; $i++)
{
$char = $line[$i];

if ('\\' == $char)
{
$i++;
$char = $line[$i];

switch ($char)
{
case '"':
$buff .= '"';
break;
case '\'':
$buff .= '\'';
break;
case ',';
$buff .= ',';
break;
default:
$buff .= '\\' . $char;
break;
}
}
elseif ('"' == $char)
{
if (0 == $quote)
{
$quote++;
}
else
{
$quote = 0;
}
}
elseif (',' == $char)
{
if (0 == $quote)
{
if (!isset($field_list[count($arr)]))
{
continue;
}
$field_name = $field_list[count($arr)];
$arr[$field_name] = trim($buff);
$buff = '';
$quote = 0;
}
else
{
$buff .= $char;
}
}
else
{
$buff .= $char;
}

if ($i == $len - 1)
{
if (!isset($field_list[count($arr)]))
{
continue;
}
$field_name = $field_list[count($arr)];
$arr[$field_name] = trim($buff);
}
}
$goods_list[] = $arr;
}
if(!empty($goods_list)){
$count_insert=0;
$count_update=0;
foreach($goods_list as $val){
$sql="select mobilenumber from {$table}mobile where mobilenumber='$val[mobilenumber]'";
$num=$db->getOne($sql);
if(empty($num)){
$sql="insert into {$table}mobile (mobilenumber,name,address,brand,price,paytime) values('$val[mobilenumber]','$val[name].','$val[address]','$val[brand]','$val[price]','$val[paytime]')";
$res = $db->query($sql);
$count_insert=$count_insert+1;
}
else{
$sql="update {$table}mobile set name='$val[name]',address='$val[address]',brand='$val[brand]',price='$val[price]',paytime='$val[paytime]' where mobilenumber='$val[mobilenumber]'";
$res = $db->query($sql);
$count_update=$count_update+1;
}
$count_all=$count_insert+$count_update;
}
$msg="数据<font color=red><b>".$count_all."</b></font>条成功更新<br>新增<font color=red><b>".$count_insert."</b></font>条<br>更改<font color=red><b>".$count_update."</b></font>条";
show($msg);
}
else{
show('没有相关数据,请确认上传CSV文件内有数据');
}
...全文
583 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
konio 2009-09-23
  • 打赏
  • 举报
回复
555 不是很了解.
我现在用phpmyadmin导入

不过还是想知道有没有其他办法
「已注销」 2009-09-15
  • 打赏
  • 举报
回复
文件指针按行读入缓冲区会比较好~
你把这么多数据都载入内存
而实际这些数据都是一次性使用
其实并不能有效利用内存和cpu时间~
konio 2009-09-15
  • 打赏
  • 举报
回复
顶下

21,886

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧