通過(guò)分析問(wèn)題茬祷,一步步拆解問(wèn)題,原先不是很確定的人工處理的方案竟终,通過(guò)寫工具就變成一個(gè)非瞅疴可靠的解決方案了。
一统捶、背景
前幾天榆芦,同事突然接到一個(gè)緊急需求:將所有的 XXX 文字替換為 YYY 文字。
如果僅僅看著需求喘鸟,很簡(jiǎn)單匆绣,找到所有的 XXX 替換即可。
但是這個(gè)問(wèn)題在于什黑,這些 XXX 文字都在圖片上崎淳。
幸運(yùn)的是,所有圖片地址都已經(jīng)在數(shù)據(jù)庫(kù)里面了愕把。
不幸的是拣凹,這些圖片地址里面有一些無(wú)關(guān)的文字,需要提取出圖片地址恨豁。
面對(duì)這樣的臨時(shí)需求嚣镜,該如何找到一個(gè)方案來(lái)解決呢?
二橘蜜、手動(dòng)處理
分析一:雖然文字在圖片上菊匿,但是有這個(gè)文字的圖片應(yīng)該很少。
方案一:先手動(dòng)把最容易找到的圖片替換了扮匠。
同事采用了最原始的方案一捧请。
我看到這個(gè)方案,問(wèn)了幾個(gè)問(wèn)題棒搜。
問(wèn)題1:圖片在數(shù)據(jù)庫(kù)替換修復(fù)后疹蛉,外網(wǎng)全部生效需要多生時(shí)間?
回答1:新系統(tǒng)需要清洗全量數(shù)據(jù)(目前有幾億數(shù)據(jù))力麸。
問(wèn)題2:如果花費(fèi)若干小時(shí)清洗完數(shù)據(jù)了可款,發(fā)現(xiàn)漏了怎么辦育韩?
回答2:。闺鲸。筋讨。
問(wèn)題3:如果人工排查數(shù)據(jù)庫(kù)的圖片地址,怎么樣摸恍?
回答3:數(shù)據(jù)庫(kù)里圖片地址太多悉罕,人工不太可行。
對(duì)于默認(rèn)方案立镶,幾乎所有人都可以想到壁袄。
但是大部分人沒(méi)去思考默認(rèn)方案是否可以 100% 的解決問(wèn)題。
如果沒(méi)有 100% 解決媚媒,代價(jià)又是什么嗜逻。
三、腳本處理
基于手動(dòng)解決這個(gè)問(wèn)題可能有遺漏缭召,我又問(wèn)了另外一個(gè)問(wèn)題栈顷。
問(wèn)題4:圖片去重后會(huì)很多嗎?
回答4:不會(huì)很多嵌巷,可能有幾十個(gè)或一百多個(gè)萄凤。
明確了圖片不是很多,我提出一個(gè)方案:寫個(gè)腳本下載所有圖片搪哪,然后再人工確認(rèn)蛙卤。
同事發(fā)出疑問(wèn)5:文字在圖片中,怎么判斷圖片是否有這個(gè)文字噩死?
回答5:圖片全部下載下來(lái),人眼看就行了神年。
接著同事提出下個(gè)問(wèn)題6:圖片地址在數(shù)據(jù)庫(kù)中已维,URL夾雜在其他文本中,怎么辦已日?
回答6:先從數(shù)據(jù)庫(kù)導(dǎo)出含圖片地址的文本數(shù)據(jù)垛耳,分析一下數(shù)據(jù),處理一下數(shù)據(jù)飘千,提取出圖片地址即可堂鲜。
同事好像還是不明白的意思,于是我說(shuō):我來(lái)寫這個(gè)工具吧护奈。
四缔莲、腳本工具
問(wèn)題很明確了,我們需要幾步來(lái)處理霉旗。
1痴奏、導(dǎo)出文本數(shù)據(jù)
2蛀骇、處理文本數(shù)據(jù),得到所有圖片地址并去重
3读拆、下載所有圖片地址
4擅憔、人工快速找到有對(duì)應(yīng)文字的圖片與地址
第一步:一條 SQL導(dǎo)出數(shù)據(jù)。
大概如下:
1. mysql -e "select field1,field2 from table" > data_001.txt`
第二步:分析數(shù)據(jù)特征檐晕。
分析數(shù)據(jù)后暑诸,發(fā)現(xiàn)有下面三個(gè)特征。
1辟灰、圖片地址中沒(méi)有逗號(hào)和空格个榕,數(shù)據(jù)庫(kù)中多個(gè)圖片地址會(huì)用逗號(hào)或者分隔。
2伞矩、對(duì)于圖片地址笛洛,都是都有 http 前綴。
3乃坤、部分圖片地址苛让,在 http 前有一些其他連續(xù)字符,大概格式時(shí) xxx=http湿诊,而且 xxx 以數(shù)字為前綴狱杰。
第三步:對(duì)數(shù)據(jù)標(biāo)準(zhǔn)化。
我敲了幾個(gè)命令就得到了想要的圖片地址厅须。
1. sed 's/[; ]/\n/g' #將所有的逗號(hào)和空格替換為換行`
2. grep "http" #篩選出圖片地址`
3. sed 's/^[0-9]\+[^=]\+=//' #去除 xxx= 數(shù)字前綴`
4. sort #排序`
5. uniq #去重`
由此仿畸,就只剩最后一步:下載所有圖。
下載后朗和,windows 文件夾調(diào)整為 中等圖標(biāo)错沽,就可以預(yù)覽所有圖標(biāo)了。
PS:同事又問(wèn)怎么根據(jù)數(shù)字圖片名找到圖片地址呢眶拉? 我只說(shuō)了兩個(gè)字:行號(hào)千埃。
后來(lái),我發(fā)現(xiàn)也可以不下載圖片忆植,于是我就生成了一個(gè)包含所有圖片的 HTML放可, 瀏覽器打開(kāi)就可以看到所有圖片了。
五朝刊、最后
當(dāng)然耀里,下載所有圖片后,發(fā)現(xiàn)只有一張圖片有目標(biāo)文字拾氓。
但是第二個(gè)方案卻比第一個(gè)方案更可靠冯挎。
因?yàn)榈谝粋€(gè)方案具有不確定性,萬(wàn)一沒(méi)有徹底修復(fù)就需要花費(fèi)很多時(shí)間再來(lái)一次咙鞍。
而第二個(gè)方案花了我五分鐘织堂,就 100% 確保徹底解決了這個(gè)問(wèn)題叠艳。
寫這篇文檔的目的是想告訴大家,很多事情可以通過(guò)腳本工具化來(lái)解決易阳。
而寫這些腳本工具也并沒(méi)有想象的那么難(并不需要圖片識(shí)別)附较,也沒(méi)有浪費(fèi)多少時(shí)間(5分鐘)。
但是潦俺,腳本化可以得到一個(gè)靠譜的解決方案拒课。
總的來(lái)說(shuō),通過(guò)分析問(wèn)題事示,一步步拆解問(wèn)題早像,原先不是很確定的人工處理的方案,通過(guò)寫工具就變成一個(gè)非承ぞ簦可靠的解決方案了卢鹦。
2019-08-21 晴天 《完》
-EOF-
本文公眾號(hào):天空的代碼世界
個(gè)人微信號(hào):tiankonguse
QQ算法群:165531769(不止算法)
知識(shí)星球:不止算法