因爲工作經常面對大量數據製作,數據製作又佔用了很多時間,所以往往編寫腳本或程序來處理。
這個是移動手機號段與區號的對應關係數據,從局方獲得原始數據文件,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;
}
}