JAVA+MYSQL+CSV用正則表達式獲取CPU天梯分數

前言

這是一次補記錄,那天接到基友一個臨時任務。根據他給的文件,分析並獲取CPU天梯榜的分數,然後進行分級。

下面開始我們的思路拆解:

數據處理部分

如果有多份文件,也都是按照這個思路處理。

原始CPU數據:

  1. 首先是excel文件,爲每一列添加一個序列seq,並另存爲CSV。例如cpu_1020.xlsx另存爲cpu_1020.csv在這裏插入圖片描述
  2. 然後通過navicat的導入嚮導功能,可以導入爲數據庫表。cpu_1020表.在這裏插入圖片描述
  3. 導入後應該是三列信息,可以修改一下字段名爲str8c1seq 。添加一個score用於保存天梯分數,添加keyword用於保存關鍵字提取數據。
  4. 獲取對應的DDL語句 CREATE TABLEcpu_1020(str8varchar(255) DEFAULT NULL,c1varchar(255) DEFAULT NULL,seqvarchar(255) DEFAULT NULL,scorevarchar(255) DEFAULT NULL,keywordvarchar(255) DEFAULT NULL ) ENGINE=MyISAM DEFAULT CHARSET=utf8;
  5. Spring Boot Code Generator 進行轉換,可以生成需要的JPA entity和repository等文件。在這裏插入圖片描述
  6. JPA的話,需要修改seq字段爲@Id,str8可能會存在重複或者非法內容,不適合做id,這也就是加seq的原因之一,另一個是方便知道後面排序後的數據是之前文件的第幾行,總之還是不錯的。在這裏插入圖片描述

天梯數據部分:

  1. 到新浪APP的CPU性能排名榜http://itianti.sinaapp.com/index.php/cpu 獲取記錄。
  2. 藉助Chrome的F12功能,刪除掉不必要的元素,整個topbar,footer,title,titletip,right這五個可以刪除掉。然後就得到一個乾淨的表格了,可以直接copy到excel。在這裏插入圖片描述在這裏插入圖片描述
  3. 慣例,加上seq列,處理一下excel文件,保存爲csv格式在這裏插入圖片描述
    10.導入mysql爲cpu_rank表,依舊加上keyword,並且到http://java.bejson.com/generator生成爲需要的JPA文件。

正則表達式分析:

可以到 正則表達式在線測試工具 進行分析。

根據我對CPU的理解,一般,CPU分爲三個陣營,Intel,AMD,VIA(out了)。

然後型號方面,一般都是 i3/5/7-xxxx ,也就是3到10位的數字或者字母或者-。帶的後綴,也就是6400T低功耗/6500U低壓/9100F無核顯/9700K超頻/G5600奔騰金牌/P6000奔騰/移動的4610M/4790S節能/3900X(AMD)/4700XM移動高端/E3E5E7的E/打樁機的2990WX/E5-2697A/E5-2618L/Xeon D-2143IT

最後得到一個精華的表達式[F,H,Q,P,E,K,U,S,T,P,M,W,X,A,L,0-9,i-]{3,10}
在這裏插入圖片描述

JAVA部分

提取分析keyword並且保存到數據庫表的keyword字段,包括原始數據cpu_1020和CPU天梯表cpu_rank也分析一下。

	@RequestMapping("/deal")
	public Object dealCpu1(){
		String patternString = "[F,H,Q,P,E,K,U,S,T,P,M,W,X,A,L,0-9,i-]{3,10}";
		Pattern pattern = Pattern.compile(patternString);
		List<Cpu1020> cpuList = cpu1020Repository.findAll();
		for (Cpu1020 cpu1020:cpuList){
			if(!StringUtils.isBlank(cpu1020.getStr8())){
				Matcher matcher = pattern.matcher(cpu1020.getStr8());
				//System.out.println(cpu1020.getStr8());
				if(matcher.find()){
					String name= matcher.group();
					System.out.println("match->"+name);
					cpu1020.setKeyword(name);
					cpu1020Repository.save(cpu1020);
				}
			}
		}
		return null;
	}

MYSQL匹配分數部分

處理一下即可。

UPDATE cpu_1020 t1 
SET t1.score =(
	SELECT
		t2.score 
	FROM
		cpu_rank t2 
	WHERE
		INSTR( t2.keyword, t1.keyword )> 0 
	ORDER BY
		LENGTH( t2.keyword ) 
	LIMIT 1 
	);

在這裏插入圖片描述

優化思路

AMD和Intel的U,型號其實有一小部分是串號的,如果有時間,可以Intel和AMD分開計算,就比較準確了,至於最後一些沒有匹配到的坑爹型號則要大致根據類型,去匹配一個差不多的分數了。。。

當然,後來發現原始CPU數據都有問題,所以就需要提前處理一下,有些沒用的數據或者錯誤的非法的數據可以去掉。懶的話也可以後面在count一下沒用分數的cpu,然後選擇性的處理,刪除或者補分數。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章