因为工作经常面对大量数据制作,数据制作又占用了很多时间,所以往往编写脚本或程序来处理。
这个是移动手机号段与区号的对应关系数据,从局方获得原始数据文件,execl文件,然后根据原始数据文件制作成shell脚本处理的数据文件,从后台倒入数据。
原始数据如下,第一行为手机号前四位,第一列为区号,交叉的是手机号第五位到7位,要把它们拼起来,形成7位的号首,区号对应全国的,很多,号段一般10个20个不等:
城市区号 | 1890 | 1891 | 1892 | 1893 |
20 | 220-229、230、232、233、238、239、240、249、300、301、305-307 | 210-219、220-229、 | ||
755 | 220-229、230、232、233、238、2399、301、305-307
| 840-849、458-459、460-467、675-679 |
下面是对这个数据的简单处理程序,还要手工改变程序~~:有时间再改进,现在是能完成任务就行了。
需要下载jexcelapi,地址:
http://www.andykhan.com/jexcelapi/download.html
将下载后的文件解包,得到jxl.jar,放入classpath,安装就完成了。它的用法可上网找下。
基本操作
/* @author luolihui
* @date 2008-10-17
* @version 1.0
*
* 修改记录:
* 首次完成:2008-10-17
*/
import java.io.*;
import jxl.*;
import jxl.write.*;
public class MakeHeadNun
{
//区号个数
private static int AREA_NUN = 296;
//号首个数
private static int HEAD_NUN = 20;
//分隔符
private static String SEPERATE = ",";
//连号符
private static String JOIN = "-";
//需要制作的数据文件
private static String XLS_FILE_NAME = "anhui.xls";
//生成的数据文件
private static String OUT_FILE_NAME = "anhui.unl";
public static void main(String[] args)
{
int a_num = 0;
int h_num = 0;
int total_num = 0;//制作的总数据条数
System.out.println("Begin to make native head number,please wait...\n");
try
{
//读取execl文件
Workbook book= Workbook.getWorkbook(new File(XLS_FILE_NAME));
/*
//判断输出文件是否已经存在
File file = new File(OUT_FILE_NAME);
if (file.exists())
{
System.out.println("输出的文件名已经存在!");
throw new Exception("输出的文件名已经存在!");
}
*/
//创建输出文件
BufferedWriter outfile=new BufferedWriter(new FileWriter(OUT_FILE_NAME));
PrintWriter out=new PrintWriter(outfile);
//获得第一个工作表对象
Sheet sheet = book.getSheet(0);
for ( h_num = 1; h_num <= HEAD_NUN; h_num++)//列
{
for ( a_num = 1; a_num <= AREA_NUN; a_num++)//行
{
//获得区号与号段头
Cell area_cell = sheet.getCell(0,a_num);
Cell head_cell = sheet.getCell(h_num,0);
//转换成String类型
String area = area_cell.getContents();
String head = head_cell.getContents();
//System.out.println("area::" + area);
// System.out.println("head::" + head);
//如果区号与号头为空,抛出异常,退出
if (area == null || "".equals(area) || head == null || "".equals(head))
{
throw new Exception("区号或号段为空!");
}
//打印单元格编号
//System.out.print("(" + h_num + "列," + a_num + "行)");
//得到a_num行h_num列的单元格
Cell cell = sheet.getCell(h_num,a_num);
//转换成String类型
String head_list = cell.getContents().trim();
//如果单元格不为空,调用函数printExcel,并返回制作的数据数量
if (head_list != null)
{
total_num = total_num + printExcel(head_list,out,head,area);
}
}
}
//关闭文件
out.flush();
out.close();
outfile.close();
System.out.println("success! total native head number is " + total_num + "!\n");
System.out.println("Please see file: " + OUT_FILE_NAME + "\n");
}
catch(Exception e)
{
System.out.println("fail!");
//显示出错的行和列
System.out.println("\n出错了!!!!!!!!!");
System.out.println("出错的行数::" + ++a_num);
System.out.println("出错的列数::" + ++h_num);
//System.out.println(e);
e.printStackTrace();
}
}
/**
* 单元格字符串,由号段的第5位到第7位组成,制作成XXXXXXX|YYY|的格式,XXXXXXX
* 表示号首,YYY表示区号
* 输入参数:单元格字符串,输出文件句柄,前四位号首,区号
*
* @author luolihui
* @date 2008-10-17
*
* @param String
* @param PrintWriter
* @param String
* @param String
*/
public static int printExcel(String head_list,PrintWriter out,String head,String area)
throws Exception
{
int start = 0;
int end = 0;
int total = 0;//本次生成的数据量
for (int i = 0; i < head_list.length(); i++)
{
//如果等于分隔符,跳过
if ( head_list.substring(i,i+1).equals(SEPERATE))
{
continue;
}
start = Integer.parseInt(head_list.substring(i,i+3));
//System.out.println("start::" + start);
//到当前数值后第三位如果小于整个单元格字符串长度,说明可能还有数据
//根据后面的字符判断进行不同处理
if ((i + 4) < head_list.length())
{
//如果等于"-"连接符
//即是否200-300这种情形
if (head_list.substring(i+3,i+4).equals(JOIN))
{
end = Integer.parseInt(head_list.substring(i+4,i+4+3));
//System.out.println("end::" + end);
for (int j = start; j <= end ; j++)
{
//写文件
//因为号码可能从000-001,010-019,转变成整形后,前面的0丢了,因此要补全
if ( j >= 0 && j < 10)
{
out.write(head + "00" + String.valueOf(j) + "|" + area + "|");
}
else if (j >= 10 && j < 100)
{
out.write(head + "0" + String.valueOf(j) + "|" + area + "|");
}
else
{
out.write(head+String.valueOf(j) + "|" + area + "|");
}
out.println();
total ++;
}
i = i + 6;
}
//如果是200 、这种情形(后带一个分隔号)
else if (head_list.substring(i+3,i+4).equals(SEPERATE))
{
//写文件
if (start >= 0 && start < 10)
{
out.write(head + "00" +String.valueOf(start) + "|" + area + "|");
}
if (start >=10 && start < 100)
{
out.write(head+ "0" + String.valueOf(start) + "|" + area + "|");
}
else
{
out.write(head+String.valueOf(start) + "|" + area + "|");
}
out.println();
i = i + 3;
total ++;
}
else
{
System.out.println("输入文件的数据制作有误!");
throw new Exception("输入文件的数据制作有误!");
}
}
else
{
//写文件
if (start >= 0 && start < 10)
{
out.write(head + "00" +String.valueOf(start) + "|" + area + "|");
}
if (start >=10 && start < 100)
{
out.write(head+ "0" + String.valueOf(start) + "|" + area + "|");
}
else
{
out.write(head+String.valueOf(start) + "|" + area + "|");
}
out.println();
i = i + 3;
total ++;
}
out.flush();
}
return total;
}
}