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