公司需要一個統計一下一個txt文本中 黑體字部分不同數據出現的次數 ,把結果做成excel文件交上去。txt內容就像下面的:
想了一下大概涉及這幾個方面:1.黑體字的提取 2.黑體字的去重 3.出現次數的統計
涌入腦中的方案有三個:
a.直接上java代碼,用IO流處理文本,逐行獲取後截取字符串,在進行重複的邏輯判斷,同時記錄下來出現了多少次------太麻煩
b.截取字符串後,存到數據庫中,使用distinct和count函數處理-----也麻煩
c.直接逐行寫入excel,再進行excel方面的處理-----這個還不錯,因爲a和b最後還是需要記錄到excel中
決定後考慮了下總體的邏輯,如下:
第一部分:txt到xls
/*
* 需求:把txt文件按照每行內容寫入excel文件
* 步驟:
* 1.讀取txt文件----getTxt方法
* 2.創建excel文件,創建sheet----getFactory方法
* 3.創建row,循環創建cell,並把內容寫入---writeTxtToExcel方法
*/
第二部分:xls操作
/*
* 需求:統計不同數據的出現次數
* 步驟:
* 1.分裂出黑體字部分
* 2.去除重複
* 3.統計出現次數
*/
過程下來還是挺快的,就是有些小坑
第一部分詳細:
獲取txt方法
//讀取txt文件
public BufferedReader getTxt(String txtPath){
try {
File file = new File(txtPath);
BufferedReader br = new BufferedReader(new FileReader(file));
return br;
} catch (Exception e) {
System.out.println("解析txt文件有誤");
e.printStackTrace();
}
return null;
}
創建xls中的factory方法-----引入的是poi-ooxml包,3.15版本。處理excel不止這一種包
//創建excel文件中的factory
public Workbook getFactory(String excelPath){
Workbook book = null;
try {
book = new HSSFWorkbook();
} catch (Exception e) {
System.out.println("創建excel文件失敗");
e.printStackTrace();
}
return book;
}
內容寫入writeTxtToExcel方法
//創建row,循環創建cell,並把內容寫入
public void writeTxtToExcel(String txtPath,String excelPath){
try {
BufferedReader br = getTxt(txtPath);
String str = null;
int index = 0;//標記excel文件寫入時的換行
Workbook factory = getFactory(excelPath);
Sheet sheet = factory.createSheet();
sheet.setColumnWidth(0,50*256);//設置列寬---50個字符寬
//把讀取到的每行數據寫入sheet
while((str = br.readLine()) != null){//逐行讀取,判斷的同時賦值
Cell cell = sheet.createRow(index).createCell(0);//寫入第一列的所有行
if(StringUtils.isNotEmpty(str)){
System.out.println(str);
cell.setCellValue(str);
}
index++;
}
//把sheet寫入excel文件
OutputStream os = new FileOutputStream(excelPath);
factory.write(os);
os.close();
} catch (Exception e) {
System.out.println("內容寫入失敗");
e.printStackTrace();
}
}
這個方法中有個問題還沒搞明白:逐行讀取的str值set進cell中之前有個判斷,打印出來的str結果是不包含空行的,但是寫入excel的數據死活都有空行,試了很多遍都不行
當然了,也可以再寫一些方法,比如:給數據插入標題,單元格樣式設置等等。上頭等着要數據,我就沒弄。
測試方法:我是使用的spring提供的測試。用main方法也行,但是方法注意static關鍵字
@Test
public void test02(){
String txtPath = "d:/lung/openID.txt";//已存在的txt文件路徑
String excelPath = "d:/lung/openID.xls";//要創建的excel文件路徑
writeTxtToExcel(txtPath, excelPath);
System.out.println("寫入完畢");
}
這裏說明一下,我創建的格式是xls格式。如果是xlsx格式,offer打開報錯,使用wps兩種都可以打開,說是offer版本的問題
結果如圖:
至此,從txt寫數據到excel的功能實現了。
----------------------------------------------------------------------------------------------------------------------------------------
第二部分詳細:
去除空行:
我使用的是比較笨的方法:找的excel中的“篩選”--->只選擇 “空白”,如圖:
空白行已經單獨標出來了,選中這些行,刪除行就行了
分裂出黑體部分:
選中A列,找到“數據”中的“分列”---->“分隔符號”--->”其他“,輸入” . “。因爲數據中的黑體部分正好有個” . “。然後刪除A列就行了
去除重複:
複製這些數據到隔壁列B列,選中B列後,找到 “去除重複值”,確定即可
統計出現次數:
在C1格輸入 “=countif(a1:a41,b1)”------說明:countif方法,兩個參數:原始數據的開始和結束位置;要找出現次數的數據所在位置。回車
複製C1格後,選中C列,右鍵選中 粘貼中的 “選擇性粘貼”--->“公式”即可
最後手動加個標題就好看些
至此,數據的統計工作也完成了
總結:
1.讀取和寫入文件時,最好路徑名命名清楚,不然容易混淆
2.如果想再往已經有數據的excel中添加數據,只要稍加修改writeTxtToExcel方法即可
3.其他的好像沒什麼了
LG