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