JAVA+MYSQL+CSV用正規表示式獲取CPU天梯分數

Moshow鄭鍇發表於2020-04-07

前言

這是一次補記錄,那天接到基友一個臨時任務。根據他給的檔案,分析並獲取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,然後選擇性的處理,刪除或者補分數。

相關文章