摘要:背景作為正在探索如何寫(xiě)作并發(fā)表到各大博客平臺(tái)的新人目前雖然已基本弄清寫(xiě)作和發(fā)表的基本流程但是離打造個(gè)人知名度還差很大很大一段距離尤其處于新手階段需要的更是自信與外界的積極反饋看著各平臺(tái)日益增長(zhǎng)的閱讀量和粉絲量心中自然不甚欣喜但是持續(xù)的技術(shù)輸
背景
作為正在探索如何寫(xiě)作并發(fā)表到各大博客平臺(tái)的新人,目前雖然已基本弄清寫(xiě)作和發(fā)表的基本流程,但是離打造個(gè)人知名度還差很大很大一段距離.
尤其處于新手階段,需要的更是自信與外界的積極反饋,看著各平臺(tái)日益增長(zhǎng)的閱讀量和粉絲量,心中自然不甚欣喜.
但是,持續(xù)的技術(shù)輸出能否堅(jiān)持下去很大程度上靠的是外界的積極反饋,如果寫(xiě)的文章基本沒(méi)人看,或者反映并不理想,估計(jì)也很難再堅(jiān)持創(chuàng)作了.
所以筆者每天晚上都會(huì)統(tǒng)計(jì)一下各個(gè)平臺(tái)的數(shù)據(jù),看一下有哪些收獲,只有看得見(jiàn)的數(shù)據(jù)才能給我安全感和自信心.
下面簡(jiǎn)單展示一下每日數(shù)據(jù)統(tǒng)計(jì)效果:
每日數(shù)據(jù)統(tǒng)計(jì)這里列出的平臺(tái)默認(rèn)是沒(méi)有提供數(shù)據(jù)分析功能,而有些平臺(tái)已經(jīng)提供數(shù)據(jù)分析,說(shuō)不定還要豐富圖表分析功能,自然不用像下面這般復(fù)雜操作.
所以,針對(duì)沒(méi)有提供數(shù)據(jù)分析的平臺(tái),只好采用人工方式進(jìn)行每日數(shù)據(jù)統(tǒng)計(jì),一開(kāi)始文章比較少,用肉眼加計(jì)算器就能很輕松得到閱讀量和粉絲數(shù)等數(shù)據(jù).
但是,隨著文章的每日更新,不斷累加的文章越來(lái)越多,人工方式簡(jiǎn)直讓我崩潰,比如昨晚在統(tǒng)計(jì)慕課網(wǎng)手記相關(guān)數(shù)據(jù)時(shí)就意外被一旁的小侄子打斷三次!
簡(jiǎn)直不可忍受,窮則思變,懶則想法偷懶,所以是時(shí)候探索新的方式解決純手動(dòng)的弊端了!
全網(wǎng)匯總數(shù)據(jù) 慕課手記 簡(jiǎn)書(shū) 博客園 騰訊云社區(qū)圖表渲染效果來(lái)自 gitbook 的 chart 插件,詳情請(qǐng)參考 官網(wǎng)文檔懶則想法偷懶 回顧操作流程
要想解放重復(fù)勞動(dòng)量,必須先知道問(wèn)題瓶頸,現(xiàn)在先回顧一下手動(dòng)操作流程.
登錄各大博客平臺(tái)后臺(tái),找到文章列表.
打開(kāi)計(jì)算器按照閱讀量等指標(biāo)累加每篇文章的相關(guān)數(shù)據(jù).
更新統(tǒng)計(jì)頁(yè)面數(shù)據(jù),利用 chart 插件渲染圖標(biāo).
修改 chart 渲染數(shù)據(jù)語(yǔ)法,截圖渲染效果.
確認(rèn)渲染效果并推送到 github 網(wǎng)站
本來(lái)不必利用截圖表示圖表的,只是無(wú)奈 github 不支持 chart 插件語(yǔ)法,只好用截圖代替了.思考問(wèn)題瓶頸
分析上述流程后不難發(fā)現(xiàn),最復(fù)雜也是最費(fèi)時(shí)費(fèi)力的便是第二步的數(shù)據(jù)統(tǒng)計(jì),由于要肉眼統(tǒng)計(jì)文章并用計(jì)算器累加,簡(jiǎn)直是手腦并用,只有高度專注才能保證統(tǒng)計(jì)數(shù)據(jù)的準(zhǔn)確性和可靠性.
這也就解釋了被打斷三次后的崩潰了,找到問(wèn)題的根源了,想辦法如何解決吧!
最容易想到的解決辦法是手動(dòng)復(fù)制文章列表數(shù)據(jù),然后程序分析提取關(guān)鍵數(shù)據(jù),最后再統(tǒng)計(jì)數(shù)據(jù).
又是三步操作,再分解一下步驟,看看目前能夠解決哪部分.
手動(dòng)復(fù)制文章列表數(shù)據(jù)
程序分析提取關(guān)鍵數(shù)據(jù)
統(tǒng)計(jì)指標(biāo)數(shù)據(jù)
在這三步中,只有第二步最為關(guān)鍵,也是目前我能做到的事情,因?yàn)榈谝徊娇赡苄枰老x(chóng)技術(shù)或模擬接口調(diào)用,總體來(lái)說(shuō),總體來(lái)說(shuō)還是比較麻煩的,以后再繼續(xù)優(yōu)化吧.
梳理操作流程因此,現(xiàn)在先著手如何將復(fù)制后的文章列表轉(zhuǎn)化成程序能夠處理的文件格式,進(jìn)而調(diào)用程序統(tǒng)計(jì).
下面以慕課網(wǎng)手記文章為例,簡(jiǎn)單介紹下處理流程.
手動(dòng)復(fù)制文章現(xiàn)在文章已復(fù)制到文件,應(yīng)該保存成什么格式呢?這又是一個(gè)思考點(diǎn).
由于文件內(nèi)容最終需要被程序處理,而程序處理要求數(shù)據(jù)需要具備一定的格式,因此自然不能是 txt 或 word 這類文檔,平常接觸比較多的文檔數(shù)據(jù)處理一般就是 excel 或者 json 類型的文檔.
這里需要 excel 這種格式文檔,但是 excel 比較笨重,還需要相關(guān)軟件才能打開(kāi) excel 文件,好像并不是很適合,怎么辦呢?
但是我真的需要這種一行一行的數(shù)據(jù)格式啊,有沒(méi)有折中的處理方案?
當(dāng)然有!輕量級(jí)的 csv 格式不是巧合適合簡(jiǎn)單文檔處理嗎?
csv 和 excel 具有類似的特征,大體上都是一行一行一列一列地存儲(chǔ)數(shù)據(jù),最適合統(tǒng)計(jì)數(shù)據(jù)了.
看著亂七八糟的文章列表,csv 也無(wú)法處理這種復(fù)雜數(shù)據(jù)啊,接下來(lái)還是要手動(dòng)格式化數(shù)據(jù),整理一下數(shù)據(jù).
程序分析提取至此,我們已經(jīng)完成數(shù)據(jù)分析的第一步了,接下來(lái)是如何讀取 csv 文件,由于本人是 java 程序員,所以我要看一下 java 如何處理 csv 文件.
需求很簡(jiǎn)單,編寫(xiě)一個(gè) csv 工具類并實(shí)現(xiàn)基本的寫(xiě)入和讀取操作即可.
說(shuō)到工具類當(dāng)然首選現(xiàn)成的開(kāi)源工具了,畢竟小小的需求不值得造輪子.
說(shuō)到開(kāi)源工具,腦海中第一個(gè)閃現(xiàn)的是 Apache Commons 工具類,所以先去 maven 上搜一下有沒(méi)有 csv 相關(guān)的工具類.
在線搜索 commons-csv
天不負(fù)我!果然有 csv 相關(guān)工具類,下面就開(kāi)始研究如何調(diào)用吧!
集成 commons-csv 工具類
org.apache.commons commons-csv 1.6
編寫(xiě)工具類
/** * 寫(xiě)入csv文件 * * @param data 數(shù)據(jù)內(nèi)容 * @param filePath 文件路徑 * @throws IOException **/ public static void writeCsv(Listdata, String filePath) throws IOException { FileWriter fw = new FileWriter(new File(filePath)); final CSVPrinter printer = CSVFormat.EXCEL.print(fw); printer.printRecords(data); printer.flush(); printer.close(); } /** * 讀取csv文件 * * @param filePath 文件路徑 * @return CSVRecord 迭代對(duì)象 * @throws IOException **/ public static Iterable readCSV(String filePath) throws IOException { InputStream inputStream = new FileInputStream(filePath); InputStreamReader isr = new InputStreamReader(inputStream); Iterable records = CSVFormat.EXCEL.parse(isr); return records; } /** * 測(cè)試寫(xiě)入并讀取csv 文件 */ private static void testWriteAndRead() throws IOException { //寫(xiě)入數(shù)據(jù) List data = new ArrayList (); data.add(new String[]{"張三", "18", "3000"}); data.add(new String[]{"李四", "20", "4000"}); data.add(new String[]{"王二", "25", "5000"}); //寫(xiě)入文件路徑 String path = "/Users/sunpo/Downloads/testWriteAndRead.csv"; //寫(xiě)入 csv 文件 writeCsv(data, path); //讀取文件 Iterable records = readCSV(path); for (CSVRecord record : records) { for (String string : record) { System.out.print(string); System.out.print(" "); } System.out.println(); } }
測(cè)試寫(xiě)入并讀取功能
測(cè)試結(jié)果真實(shí)可用,工具類基本功能編寫(xiě)完成.
已經(jīng)有了 csv 工具類,那么現(xiàn)在就要想辦法解決實(shí)際問(wèn)題,再看一下當(dāng)前慕課網(wǎng)手記的內(nèi)容格式吧!
148瀏覽 2推薦 0評(píng)論 204瀏覽 2推薦 0評(píng)論 181瀏覽 2推薦 0評(píng)論
分析上述內(nèi)容格式有以下特點(diǎn):
內(nèi)容數(shù)據(jù)一行一條數(shù)據(jù),可能需要換行符問(wèn)題
每一行數(shù)據(jù)以空格分割,可分割成數(shù)組或列表再處理
已分割后的列表項(xiàng)包括了有效數(shù)據(jù)和文字說(shuō)明,可能需要過(guò)濾出有效數(shù)據(jù)
按照上述分析結(jié)果,開(kāi)始 coding 逐個(gè)解決,下面展示下關(guān)鍵代碼.
按照空格將每一行數(shù)據(jù)分割成列表
Listrow = StringTools.splitToListString(string, " ");
StringTools.splitToListString 方式是筆者封裝的分割字符串方法,目的將字符串按照指定分隔符分割成字符串列表
處理分割后字符串列表并過(guò)來(lái)出有效數(shù)據(jù)
String readCountWithDescString = row.get(0); String readCountString = StringUtils.substringBefore(readCountWithDescString, "瀏覽"); String recommendCountWithDescString = row.get(1); String recommendCountString = StringUtils.substringBefore(recommendCountWithDescString, "推薦"); String commentCountWithDescString = row.get(2); String commentCountString = StringUtils.substringBefore(commentCountWithDescString, "評(píng)論");
StringUtils.substringBefore 方法也是Apache Commons 工具類,具體來(lái)源于 org.apache.commons.lang3 ,下述涉及到的 StringUtils 靜態(tài)方法 也是,不再多帶帶說(shuō)明.
最后一步即統(tǒng)計(jì)分析
//瀏覽數(shù) int readCount = 0; //推薦數(shù) int recommendCount = 0; //評(píng)論數(shù) int commentCount = 0; readCount += Integer.parseInt(readCountString); recommendCount += Integer.parseInt(recommendCountString); commentCount += Integer.parseInt(commentCountString);
如此一來(lái),三步均已解決,現(xiàn)在運(yùn)行以下統(tǒng)計(jì)方法,看一下真實(shí)效果如何.
/** * 統(tǒng)計(jì)慕課手記 * * @throws IOException */ private static void countImooc() throws IOException { //昨日統(tǒng)計(jì)數(shù)據(jù) String yesterday = DateFormatUtils.format(DateUtils.addDays(new Date(), -1), "yyyyMMdd"); String path = String.format("/Users/sunpo/Documents/workspace/count/imooc-%s.csv", yesterday); //總行數(shù) int allRows = 0; //有效行數(shù) int allValidRows = 0; //當(dāng)前行是否有效 boolean isValidRow = true; //瀏覽數(shù) int readCount = 0; //推薦數(shù) int recommendCount = 0; //評(píng)論數(shù) int commentCount = 0; Iterablerecords = readCSV(path); for (CSVRecord record : records) { allRows++; for (String string : record) { System.out.println(string); if (StringUtils.isBlank(string)) { isValidRow = false; break; } List row = StringTools.splitToListString(string, " "); String readCountWithDescString = row.get(0); String readCountString = StringUtils.substringBefore(readCountWithDescString, "瀏覽"); String recommendCountWithDescString = row.get(1); String recommendCountString = StringUtils.substringBefore(recommendCountWithDescString, "推薦"); String commentCountWithDescString = row.get(2); String commentCountString = StringUtils.substringBefore(commentCountWithDescString, "評(píng)論"); readCount += Integer.parseInt(readCountString); recommendCount += Integer.parseInt(recommendCountString); commentCount += Integer.parseInt(commentCountString); } if (isValidRow) { allValidRows++; } isValidRow = true; } System.out.println(); System.out.println(String.format("[慕課手記](méi) 一共讀取%d行,有效行: allValidRows = %d ,其中瀏覽數(shù): readCount = %d ,推薦數(shù): recommendCount = %d ,評(píng)論數(shù): commentCount = %d", allRows, allValidRows, readCount, recommendCount, commentCount)); System.out.println(); }
很完美,終于不必再肉眼統(tǒng)計(jì)數(shù)據(jù)了,雖然很長(zhǎng)程度上仍然依賴人工整理好 csv 文件,但是目前已經(jīng)解決了純手動(dòng)的弊端.
因此,上述解決方案是半手動(dòng)的方式,仍然還有很多可以優(yōu)化的地方,等下次忍受不了這種方案時(shí)再解決!
小結(jié)本文主要介紹了純手工統(tǒng)計(jì)報(bào)表遇到的諸多問(wèn)題,尋求一種相對(duì)簡(jiǎn)單的解決方案.
基本流程大致可以分為下述流程:
手動(dòng)復(fù)制文章列表(包括閱讀量,評(píng)論量和點(diǎn)贊數(shù)),并整理成標(biāo)準(zhǔn)的 csv 格式文件.
編寫(xiě)各個(gè)平臺(tái)的 csv 工具處理類,解析并統(tǒng)計(jì) csv 文件內(nèi)容.
運(yùn)行工具類得到最終統(tǒng)計(jì)數(shù)據(jù),大功告成!
本文主要介紹的是解決問(wèn)題的思路,對(duì)于其中涉及到的相關(guān)技術(shù)點(diǎn)并未深入展開(kāi),關(guān)鍵源碼已經(jīng)貼上,如果還想要更詳細(xì)的完整源碼,可以留言回復(fù).
文章版權(quán)歸作者所有,未經(jīng)允許請(qǐng)勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請(qǐng)注明本文地址:http://m.hztianpu.com/yun/36008.html
摘要:原文鏈接瀏覽器渲染那些事之瀏覽器內(nèi)核渲染引擎在各個(gè)瀏覽器廠商你追我趕的形勢(shì)下,截止今日,產(chǎn)生了很多不同的瀏覽器,各個(gè)瀏覽器本質(zhì)大同小異,核心部分基本相似,由渲染引擎和引擎組成。 原文鏈接 瀏覽器渲染那些事之 Reflow、Repaint 瀏覽器內(nèi)核(渲染引擎) 在各個(gè)瀏覽器廠商你追我趕的形勢(shì)下,截止今日,產(chǎn)生了很多不同的瀏覽器,各個(gè)瀏覽器本質(zhì)大同小異,核心部分基本相似,由渲染引擎和 J...
摘要:幾乎沒(méi)有人比歲的更能與深度學(xué)習(xí)緊密地聯(lián)系在一起。他于年成為紐約大學(xué)教授,并從此引領(lǐng)了深度學(xué)習(xí)的發(fā)展。最近,深度學(xué)習(xí)及其相關(guān)領(lǐng)域已然成為最活躍的計(jì)算機(jī)研究領(lǐng)域之一。 本文原載IEEE,作者Lee Gomes,由機(jī)器之心翻譯出品,參與成員:電子羊、翬、泥泥劉、赤龍飛、鄭勞蕾、流明。人工智能經(jīng)歷了幾次低潮時(shí)期,這些灰暗時(shí)光被稱作「AI寒冬」。這里說(shuō)的不是那段時(shí)期,事實(shí)上,人工智能如今變得異?;馃幔?..
摘要:摘要本文以過(guò)來(lái)人的身份將自身年的研究經(jīng)驗(yàn)做了一下分享,希望本文對(duì)于即將開(kāi)始從事人工智能研究的朋友有所幫助。此外,還有各種會(huì)議也值得關(guān)注。三大會(huì)議分別是以及。此外,當(dāng)演講者向現(xiàn)場(chǎng)觀眾演講時(shí),他們往往優(yōu)先考慮的是清晰度而不是簡(jiǎn)潔性。 摘要: 本文以過(guò)來(lái)人的身份將自身2年的研究經(jīng)驗(yàn)做了一下分享,希望本文對(duì)于即將開(kāi)始從事人工智能研究的朋友有所幫助。 人工智能研究這個(gè)領(lǐng)域是有一定門(mén)檻的。對(duì)于初學(xué)...
閱讀 3096·2023-04-26 00:32
閱讀 571·2019-08-30 15:52
閱讀 2172·2019-08-30 15:52
閱讀 3449·2019-08-30 15:44
閱讀 3341·2019-08-30 14:09
閱讀 1478·2019-08-29 15:15
閱讀 3454·2019-08-28 18:12
閱讀 1165·2019-08-26 13:55