這是個人第一篇博客,提及來有些慚愧,做爲一個程序猿居然至今沒寫過一篇技術博客。在這裏,先向讀到這篇博客的讀者致歉,原諒我粗糙的表達能力。javascript
在讀研究生以前,「程序員」對我來講,只是三個字的組合,我並不瞭解程序員的世界,也不知道一個程序員的基本素養(這個詞是從亮哥那聽來的,可是是從楊老師那瞭解的)。在這裏,我要向個人導師--楊貴福老師表示深深的感謝,他教會了我許多做爲一個程序員應有的工做的態度以及責任。html
接下來談談我第一次上我導師的課的感覺。我如今是研二,兩年來我從沒聽過個人導師上的課。上週五是我第一次聽他上課,第一感受就是風格迥異。他上課的風格和我之前的老師的style徹底不同。不按照書本上的來(固然研究生也沒有特定的課本),徹底根據本身從事工程師多年的經驗來給咱們講解軟件工程。第二感受就是內容充實、豐富。可是,可能對於初學者來講有點壓力過大。在此次課上,我聽到一個很是引發我注意的問題:「教師是服務行業嗎?」。楊老師給出的答案是:「教師不是服務行業」。的確,如今大多數學生都認爲教師是服務行業。「我」交了學費,學校提供這一服務。「我」是顧客,「我」就是上帝。「我」能夠對你提供的服務進行評論,「我」也能夠選擇是否接受你的服務。我以爲正是因爲這種想法,才組織了咱們的求知慾。這裏就再也不贅述這一話題。java
進入主題。下面談談我對詞頻統計系統的見解。個人方案是:源文件通過一個引擎解析出這個文件有多少個不一樣的單詞以及每一個單詞出現的次數,最後顯示在頻幕上。程序員
主要技術包括:1.文件的上傳。文件上傳有不少方式,這裏我選擇的是SmartUpload.jar。我的以爲簡單好用。echarts
2.單詞的分割。涉及到標點符號的處理。我在網上看到一個很好的處理方案。採用java正則替換標點。參考地址:http://blog.csdn.net/wangran51/article/details/7764256dom
3.數據的顯示。數據的顯示有不少種方案。好比文字,圖表,表格等。這裏我用的是百度的產品EChart.是免費的,並且官網有纖細的教程。參考地址:http://echarts.baidu.com/index.htmljsp
index.jsp代碼以下:post
1 <div align="center" style="margin-top:50px;"> 2 <form action="servlet/fileupload_servlet" method="post" enctype="multipart/form-data"> 3 <input type="file" name="file_name" id="file_name" accept=".txt" style="height: 40px; width: 500px; border: 1px solid;"> 4 <input type="submit" value="檢索" style="height: 40px;"> 5 </form> 6 </div>
fileupload_servlet代碼以下:ui
1 public void doPost(HttpServletRequest request, HttpServletResponse response) 2 throws ServletException, IOException { 3 4 request.setCharacterEncoding("GBK"); 5 //設置文件保存的路徑 6 Date currentData = new Date(); 7 SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd"); 8 String cal = sdf.format(currentData); 9 String filePath = getServletContext().getRealPath("/") + "upload/"+cal; 10 11 //初始化SmartUpload 12 SmartUpload upload = new SmartUpload(); 13 upload.initialize(this.getServletConfig(), request, response); 14 @SuppressWarnings("unused") 15 int count = 0; 16 com.jspsmart.upload.File tempFile = null; 17 //開始上傳 18 try { 19 upload.setMaxFileSize(10*1024*1024);//設置文件大小的上限10M 20 upload.setAllowedFilesList("txt");//設置容許上傳的文件格式,多個用,分開 21 upload.upload();//上傳文件 22 23 // 若是文件夾不存在 則建立這個文件夾 24 File file = new File(filePath); 25 if (!file.exists()) { 26 file.mkdir(); 27 } 28 count = upload.save(filePath);//保存文件到指定路徑 29 30 for (int i = 0; i < upload.getFiles().getCount(); i++) { 31 tempFile = upload.getFiles().getFile(i);//讀取剛上傳的文件 32 // File file1=new File(filePath+tempFile.getFileName()); 33 // System.out.println("-------------------------------------------------"); 34 // System.out.println("表單項名稱:" + tempFile.getFieldName()); 35 // System.out.println("文件名:" + tempFile.getFileName()); 36 // System.out.println("文件長度:" + tempFile.getSize()); 37 // System.out.println("文件擴展名:" + tempFile.getFileExt()); 38 // System.out.println("文件全名:" + tempFile.getFilePathName()); 39 } 40 } catch (SmartUploadException e) { 41 e.printStackTrace(); 42 } catch (SecurityException e) { 43 System.out.println("格式不符合"); 44 } 45 // System.out.println(count); 46 47 //////////////////////////////讀取文件/////////////////////////////// 48 49 Map<String,Integer> map = FileUtil.readtxtFile(filePath+"/"+tempFile.getFileName()); 50 System.out.println(map.toString()); 51 52 request.getSession().setAttribute("data", map); 53 String path = request.getContextPath(); 54 response.sendRedirect(path+"/Chart.jsp"); 55 }
FileUtil.java代碼以下:this
package util; import java.io.BufferedReader; import java.io.File; import java.io.FileInputStream; import java.io.FileNotFoundException; import java.io.IOException; import java.io.InputStreamReader; import java.io.UnsupportedEncodingException; import java.util.HashMap; import java.util.Map; public class FileUtil { /*** * 讀取文件,解析出單詞,並統計單詞數量 * @param filePath * 文件路徑 * @return * 返回Map對象,key是單詞,value對應單詞出現的次數 */ public static Map<String,Integer> readtxtFile(String filePath) { Map<String, Integer> index_map = new HashMap<String, Integer>(); BufferedReader reader = null; File file = new File(filePath); try { FileInputStream in = new FileInputStream(file); reader = new BufferedReader(new InputStreamReader(in, "UTF-8")); String lineText = ""; while((lineText=reader.readLine())!= null) { lineText = lineText.replaceAll("\\p{Punct}", " ").trim();//去除標點符號 // lineText = lineText.replaceAll("\\pP", " ").trim(); System.out.println(lineText); String[] lineArray = lineText.split(" "); for(String word:lineArray) { word = word.toLowerCase().trim(); if(word.length()>0) if(index_map.containsKey(word)) { int value = index_map.get(word)+1; index_map.remove(word); index_map.put(word, value); } else { index_map.put(word, 1); } } } } catch (FileNotFoundException e) { e.printStackTrace(); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } finally { try { reader.close(); } catch (IOException e) { e.printStackTrace(); } } return index_map; } }
Chart.jsp代碼以下:
1 <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> 2 <% 3 String path = request.getContextPath(); 4 String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/"; 5 %> 6 7 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> 8 <html> 9 <head> 10 <base href="<%=basePath%>"> 11 12 <title>統計圖</title> 13 <meta http-equiv="pragma" content="no-cache"> 14 <meta http-equiv="cache-control" content="no-cache"> 15 <meta http-equiv="expires" content="0"> 16 <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> 17 <meta http-equiv="description" content="This is my page"> 18 19 <!-- Step1 引入EChart.js --> 20 <script type="text/javascript" src="js/echarts.min.js"></script> 21 </head> 22 23 <body> 24 <!-- step2 創建一個圖表容器 --> 25 <div id="main" style="width: auto;height:500px;"></div> 26 <!-- step3 編寫js代碼 --> 27 <script type="text/javascript"> 28 // 基於準備好的dom,初始化echarts實例 29 var myChart = echarts.init(document.getElementById('main')); 30 31 var x_data = new Array();//x軸數據 32 var y_data = new Array();//y軸數據 33 <% 34 //從後臺讀取數據,複製給x_data和有y_data 35 Map<String,Integer> data_map = (Map<String,Integer>)request.getSession().getAttribute("data"); 36 Set set = data_map.entrySet(); 37 Iterator i = set.iterator(); 38 int index = 0; 39 while(i.hasNext()){ 40 Map.Entry<String, Integer> entry1=(Map.Entry<String, Integer>)i.next(); 41 %> 42 x_data[<%=index%>] = '<%=entry1.getKey()%>'; 43 y_data[<%=index%>] = <%=entry1.getValue().intValue()%>; 44 <% 45 index++; 46 } 47 %> 48 49 // 指定圖表的配置項和數據 50 var option = { 51 title: { 52 text: '詞頻統計圖' 53 }, 54 tooltip: {}, 55 legend: { 56 data:['詞頻'] 57 }, 58 xAxis: { 59 data: x_data 60 }, 61 yAxis: {}, 62 series: [{ 63 name: '詞頻', 64 type: 'bar', 65 data: y_data 66 }] 67 }; 68 myChart.setOption(option); 69 </script> 70 </body> 71 </html>
效果以下圖所示: