Chinaunix首页 | 论坛 | 博客
  • 博客访问: 754144
  • 博文数量: 26
  • 博客积分: 8255
  • 博客等级: 中将
  • 技术积分: 934
  • 用 户 组: 普通用户
  • 注册时间: 2006-02-06 01:52
文章分类

全部博文(26)

文章存档

2012年(1)

2011年(8)

2010年(10)

2008年(7)

分类:

2010-04-01 17:14:05

朋友手机同步出错,号码丢失。导出的EXCEL文件格式混乱,无法按映射关系导回手机。
先分析一下EXCEL文件:(截取部分数据样本,电话号码用11111替代)如下

C1                    ID         C2

全名: 1 爱尼特
名字: 2 爱尼特

3

移动电话: 4 111111111

5

全名: 6 PDA姜
名字: 7 PDA姜

8

移动电话: 9 111111

10

全名: 11 阿卡迪亚物业
姓氏: 12 阿卡迪亚物业

13

移动电话: 14 11111111

15

全名: 16 阿满
名字: 17 阿满

18

移动电话: 19 1111111111

从上述数据块来看,导出的数据,每5行其实是一个“名片”,该EXCEL中一共有1300多个名片。
我们需要将其转化成如下格式的EXCEL才能重新导回OUTLOOK:

 姓名  电话
 张三  1111
 李四  1111

如果我们手工来完成,是会死人的。

首先我们来将上述EXCEL导入MYSQL以便同PHP来加工,并重新部署数据。

1. 将原EXCEL按照以上3个字段(C1,ID,C2)分别保存为UTF-8的TXT文档。
1-1.txt 1-2.txt 1-3.txt

建立MYSQL 数据库 neil

建立表 test,字段为ID,C1,C2 (注意字段与变量的对应)

通过如下代码导入MYSQL


<?php
$id = file('c:\1-1.txt');
$C1 = file('c:\1-2.txt');
$C2 = file('c:\1-3.txt');
$i = 0;

mysql_connect('localhost','root','root');
mysql_query("set names utf8");

while (strlen($id[$i])>0)
{
$sql="insert into test values ('$id[$i]','$C1[$i]','$C2[$i]')";
$do=mysql_db_query("neil",$sql);
$i=$i+1;
echo '
'
;
}
$s="select * from test";
$gg=mysql_db_query("neil",$s);
$n=mysql_num_rows($gg);
mysql_close();
echo '
'
;
echo "共添加了".$n."个记录";


执行后以上数据就导入了MYSQL。

2. 开始剥离数据

意外: 在EXCEL原文件中,最重要的事情有两个。

第一,确定有多少张名片,怎么来识别每一张名片?
第二,如何找到每张名片中的电话号码

通过分析数据段我们发现,每张名片都有一个“全名”是它独立的字符串,虽然我们也可以通过“名字”这个字符串来区分每张名片,但我们会发现,“名字”并不是唯一的,有的名片中用“姓氏”替代了“名字”,当更糟糕的事情是,随着深入的浏览原EXCEL表格,发现即便是“全名”也不是可以用来区分每张名片的唯一标识,有的“全名”使用了其他的名称来标识。

这就意味着我们无法计算这个EXCEL中到底有多少张名片。。

但通过分析,我们可以看到,ID是一个自然的递增数列。每5行代表一张名片。这样就给了我们一个思路。

我们可以通过ID和每张名片所占有的行数,来计算到底有多少张名片。

我们需要重新来导入数据到MYSQL,目的是清除空行。我们首先删除原文件ID列,保留C1,C2列,然后清除C1,C2列中的空行。最后重新插入ID列,删除多余的ID行数。保持ID,C1,C2数据对应。效果如下:

全名: 爱尼特候怡
名字: 爱尼特候怡
移动电话: 11111111
全名: PDA姜
名字: PDA姜
移动电话: 11111111
全名: 阿卡迪亚物业
姓氏: 阿卡迪亚物业
移动电话: 11111111
全名: 阿满
名字: 阿满
移动电话: 111111111

不难发现,每张名片占用了3行。
现在我们开始数据剥离,看如下代码:


<?php
$conn = mysql_connect('localhost','root','root');
mysql_select_db('neil',$conn);
mysql_query("set names utf8");

for($i=-2;$i<=4068;$i++){
    $n = $i;
    $n = $n+3;
    $i = $n-1;
    $num = $i+1;
    
    $sql_1 = "select * from test where ID=$num";
    $singel_res = mysql_query($sql_1);
    $row = mysql_fetch_array($singel_res);
    $C1 = $row['C1'];
    $C2 = $row['C2'];
    $sql_add = "insert into fullname (name) values ('$C2')"
        $result = mysql_query($sql_add);
        if($result){
            echo "ok"."
"
;
        }else{
            echo "sorry"."
"
.mysql_error();
        }
    //}

}
?>


其中有一个算法,是专门用来计算从1-4068条记录中,挑出:
1,4,7,10,13.........
以上数列中的每一个数字,代表一张独立的名片。而其对应的C2列数据,正是我们需要整理出来的姓名,执行后效果如下:

管理员在2009年8月13日编辑了该文章文章。 -->
阅读(1610) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~