JAVA+MYSQL+CSV用正規表示式獲取CPU天梯分數
前言
這是一次補記錄,那天接到基友一個臨時任務。根據他給的檔案,分析並獲取CPU天梯榜的分數,然後進行分級。
下面開始我們的思路拆解:
資料處理部分
如果有多份檔案,也都是按照這個思路處理。
原始CPU資料:
- 首先是excel檔案,為每一列新增一個
序列seq
,並另存為CSV
。例如cpu_1020.xlsx另存為cpu_1020.csv - 然後通過navicat的
匯入嚮導
功能,可以匯入為資料庫表。cpu_1020表. - 匯入後應該是三列資訊,可以修改一下欄位名為
str8
,c1
,seq
。新增一個score
用於儲存天梯分數,新增keyword
用於儲存關鍵字提取資料。 - 獲取對應的DDL語句
CREATE TABLE
cpu_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;
- 到 Spring Boot Code Generator 進行轉換,可以生成需要的JPA entity和repository等檔案。
- JPA的話,需要修改seq欄位為
@Id
,str8可能會存在重複或者非法內容,不適合做id,這也就是加seq的原因之一,另一個是方便知道後面排序後的資料是之前檔案的第幾行,總之還是不錯的。
天梯資料部分:
- 到新浪APP的CPU效能排名榜http://itianti.sinaapp.com/index.php/cpu 獲取記錄。
- 藉助Chrome的
F12功能
,刪除掉不必要的元素,整個topbar,footer,title,titletip,right
這五個可以刪除掉。然後就得到一個乾淨的表格了,可以直接copy到excel。 - 慣例,加上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,然後選擇性的處理,刪除或者補分數。
相關文章
- Java 正規表示式捕獲組分類Java
- 正規表示式回溯-導致CPU偏高
- Python正規表示式實現非捕獲分組Python
- 匹配正整數正規表示式
- 【正規表示式】常用的正規表示式(數字,漢字,字串,金額等的正規表示式)字串
- Java 正規表示式——捕獲組Java
- 匹配小數正規表示式
- 匹配負數正規表示式
- 匹配整數正規表示式
- 匹配自然數正規表示式
- 正規表示式分組詳解
- 正規表示式的應用
- 匹配n位正整數正規表示式
- 正規表示式獲取兩個字元之間的字串資訊字元字串
- 匹配浮點數正規表示式
- 匹配純數字正規表示式
- 正規表示式
- 正規表示式.
- C#用正規表示式高效替換變數C#變數
- 20個實用正規表示式
- 5分鐘輕鬆學正規表示式
- 正規表示式分組例項詳解
- 正規表示式個位數補零
- php –正規表示式PHP
- 【Linux】正規表示式Linux
- 【JavaScript】正規表示式JavaScript
- URL正規表示式
- 正規表示式 split()
- 初探正規表示式
- 正規表示式 test()
- 正規表示式(?!)作用
- 正規表示式 {n,}
- SQL正規表示式SQL
- 正規表示式(java)Java
- Python——正規表示式Python
- PHP正規表示式PHP
- 正規表示式概括
- javascript正規表示式JavaScript