
[從產(chǎn)品角度學(xué)EXCEL 02]-EXCEL里的樹形結(jié)構(gòu)
前言請(qǐng)看:
0 為什么要關(guān)注Excel的本質(zhì)
1 excel是怎樣運(yùn)作的
本文僅由尾巴本人發(fā)布于特定網(wǎng)站。不接受任何無授權(quán)轉(zhuǎn)載,如需轉(zhuǎn)載,請(qǐng)先聯(lián)系我,非常感謝。
2 Excel里的樹形結(jié)構(gòu)
這段時(shí)間,上海街邊的樹上陸陸續(xù)續(xù)長(zhǎng)出了嫩芽,放眼望去有各種層次的綠色,格外好看。我們今天的話題,恰好也與樹有關(guān)。只不過,樹都是往天空伸展枝葉的,而我們這里討論的‘樹’,卻是由根部出發(fā),逐行逐行往下延展、伸展。
還記得上一個(gè)章節(jié)里,我們對(duì)一個(gè)excel文件解壓縮后,發(fā)現(xiàn)了若干個(gè)xml文件嗎?
xml本質(zhì)上是一種使用樹形結(jié)構(gòu)存儲(chǔ)信息的文檔。它由一個(gè)根節(jié)點(diǎn)root開始,逐層逐層長(zhǎng)枝節(jié),并給每一層都打了個(gè)標(biāo)簽,讓xml解析器可以快速定位信息的內(nèi)容。而每一層以及每一個(gè)底部的節(jié)點(diǎn),都是這些信息的一個(gè)分類屬性。我們了解了它們的屬性和層級(jí),也就了解這顆結(jié)構(gòu)樹長(zhǎng)成什么樣子。
正因?yàn)閤ml的結(jié)構(gòu)與層級(jí)是如此重要,在進(jìn)一步講單元格之前,我們很有必要先剖析看看excel xml樹的結(jié)構(gòu),從大體上再來理解一下excel儲(chǔ)存文件的方式。
需要注意的是,這一章節(jié)大概是整個(gè)系列里涉及最多編程的章節(jié)了。如果各位對(duì)編程不是特別感興趣,可以先跳過這一節(jié),去看后面的內(nèi)容。不過按照我個(gè)人的經(jīng)驗(yàn)來說,不管你是用excel做一些簡(jiǎn)單的數(shù)據(jù)處理,還是想要在數(shù)據(jù)分析行業(yè)里走得穩(wěn)妥一些,了解了解編程,只會(huì)有好處而沒有壞處。尤其是編程的一些思想,如妥善地設(shè)計(jì)接口,分隔各個(gè)功能塊等,即使你用excel處理數(shù)據(jù),這些也對(duì)你十分有好處。
言歸正傳吧。我們回過頭來再看看excel解壓縮以后的xml文件。
讓我們隨意打開一個(gè)xml文件,一串串密密麻麻的字符就這樣跳了出來。
對(duì)于不熟悉xml架構(gòu)的人來說,我們只會(huì)看到眼花繚亂的括號(hào),等號(hào),引號(hào)。但是如果你對(duì)xml有點(diǎn)理解,你就會(huì)知道,這一系列的標(biāo)點(diǎn)符號(hào)框起了一個(gè)個(gè)xml的數(shù)據(jù)結(jié)構(gòu)。
對(duì)于xml來說,每一個(gè)層級(jí)都是由<標(biāo)簽 屬性=ABC>內(nèi)容信息</標(biāo)簽>構(gòu)成的。有的內(nèi)容信息里又會(huì)再次嵌套一層標(biāo)簽層級(jí),重重相疊,從根部開始向下延展出了無數(shù)枝葉,構(gòu)成了一棵看似錯(cuò)綜復(fù)雜,卻是層次分明的xml樹。人們只要定位到某一個(gè)枝葉,就可以迅速把這個(gè)枝葉下的特定信息取出來。而要搞懂這棵xml樹長(zhǎng)什么樣子,首先就要搞懂說這棵樹是有哪些層級(jí),各個(gè)層級(jí)叫什么,有什么內(nèi)容。
但是各位再回顧看看上面的截圖,一長(zhǎng)串一長(zhǎng)串的代碼,你當(dāng)然可以一個(gè)個(gè)去判斷說,啊,根標(biāo)簽從worksheet開始,下面有selection層級(jí),有f層級(jí)等等,但是這樣子做,不僅低效,而且會(huì)有遺漏。
請(qǐng)各位在學(xué)習(xí)excel時(shí),隨時(shí)記住一個(gè)原則,那就是可以不要手工去做的事情,就不要手工去做。寧愿自己腦子廢點(diǎn)腦力構(gòu)思最優(yōu)方法,也不要直接就開始機(jī)械的作業(yè)。
那么,在這里,面臨這個(gè)要人工一個(gè)個(gè)看標(biāo)簽的艱巨任務(wù)時(shí),我們?cè)撊绾问呛媚兀?
在這里跟大家再普及一個(gè)概念的是,xml嘛,除了微軟在用于office系列文檔儲(chǔ)存格式以外,它還廣泛應(yīng)用于各種網(wǎng)頁設(shè)計(jì)領(lǐng)域。而在網(wǎng)頁獲取信息這一塊,我們天然有很多工具可以通過讀取html或者xml源代碼,解析它們的結(jié)構(gòu),進(jìn)行數(shù)據(jù)提取工作(高級(jí)點(diǎn)叫法即網(wǎng)絡(luò)爬蟲)
所以對(duì)于這里的excel xml源文件,我們自然可以應(yīng)用各種爬蟲工具,把xml的框架給找出來。
我 用的比較熟的應(yīng)該是R語言的rvest包爬蟲了,查了一下它的文檔,有一個(gè)叫xml_structure的,可以直接把xml文件的標(biāo)簽層次給讀出來,而 xml_nodes/xml_attr等,又可以把里面特定的標(biāo)簽內(nèi)容給分層讀出來。那么寫一段代碼,幫我把excel的xml源文件里的層級(jí)與內(nèi)容弄出 來,那就省了我很大的心力啦^^
因?yàn)?a href='/map/r/' style='color:#000;font-size:inherit;'>R語言代碼并不是我們的重點(diǎn),所以我把源代碼放在文章末尾的擴(kuò)展閱讀里了,有需要的可以去看看,也可以用其他語言寫寫。有的時(shí)候只要學(xué)會(huì)一點(diǎn)點(diǎn)的編程,就能大大的改善各位的工作效率。要用好工具而不是被工具玩,是我希望在這系列excel教程里告訴大家的一個(gè)點(diǎn)。
那么言歸正傳。請(qǐng)各位看看下面這個(gè)用R語言跑出來的csv文件截圖。
左列是我們的標(biāo)簽名,右列是我們標(biāo)簽里面包含的文本。通過這個(gè)文件,我們就可以很容易知道各個(gè)標(biāo)簽里存放了什么文本信息。我們會(huì)發(fā)現(xiàn)row下面是一串串的c/v/f。而c與v的信息幾乎完全一樣。
另外,在r里,我們可以通過xml_structure輸出xml文件的結(jié)構(gòu)。這兩個(gè)結(jié)合起來,我為各位繪制了一張sheet1.xml的樹形結(jié)構(gòu)圖:
各位可以看到,在worksheet文件夾里的sheet1.xml,是在sheetdata里按照row為標(biāo)簽層級(jí),存放了若干行的數(shù)據(jù)。而行又以 c(cell)為導(dǎo)向,存放了單元格的v (value)和f(函數(shù))。有多少行,在sheet1.xml里就有多少row,一個(gè)row有若干個(gè)有效單元格,就會(huì)有若干個(gè)c。
從這個(gè)角度看excel,會(huì)不會(huì)對(duì)excel的產(chǎn)品設(shè)計(jì)層次有了進(jìn)一步的理解呢?
另外,上面的截圖沒有出示的一點(diǎn)是,在worksheet這個(gè)文件夾里,數(shù)字是直接存在各個(gè)sheetxxx.xml里的,而字符類文本,卻是單獨(dú)存放在外面的SharedString.xml里。
嘿嘿,數(shù)字和文本的存放格式不一樣,各位想到了什么?有沒有虎軀一震,想到了excel里因?yàn)閿?shù)字和文本的不同,帶來的各種不便?
在前面啰嗦完為什么要寫這個(gè)系列,以及excel是怎么工作以后,我們終于把拼圖最重要的一塊——解讀xml補(bǔ)上了。
R語言解析XML源代碼:
setwd("~/excel/")
library(rvest)
#代碼用于《從產(chǎn)品角度學(xué)EXCEL》系列文章,XML解析
# read xml in zip files
get_xmllist<-function(access){
list<-list.files(access,full.names=TRUE,pattern = "xml$",recursive = TRUE)
list_name<-gsub(as.character(access),"",list)
list_name<-gsub("\\/|\\.|\\[|\\]","-",list_name)
list_name<-gsub("\\-\\-","-",list_name)
list<-data.frame(list,list_name,stringsAsFactors = FALSE)
list
}
# read xml structure
get_structure<-function(xmlfile){
data<-xml(xmlfile,encoding="UTF-8")
data<-data %>% html_nodes("*")
output<-cbind(node_names=data %>% html_tag(),
node_text=data %>% html_text())
output<-data.frame(output)
output
}
write_result<-function(dataframe,name){
write.csv(dataframe,paste0("./Output/",name,".csv"),row.names=FALSE)
}
#use these three function
xml_list<-get_xmllist("./sample u.xlsx/")
for (i in 1:nrow(xml_list)){
data<-get_structure(xml_list$list[i])
write_result(data,xml_list$list_name[i])
}
#write the structure
xml_structure(html(xml_list$list[8]))
數(shù)據(jù)分析咨詢請(qǐng)掃描二維碼
若不方便掃碼,搜微信號(hào):CDAshujufenxi
LSTM 模型輸入長(zhǎng)度選擇技巧:提升序列建模效能的關(guān)鍵? 在循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)家族中,長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)憑借其解決長(zhǎng)序列 ...
2025-07-11CDA 數(shù)據(jù)分析師報(bào)考條件詳解與準(zhǔn)備指南? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代浪潮下,CDA 數(shù)據(jù)分析師認(rèn)證愈發(fā)受到矚目,成為眾多有志投身數(shù) ...
2025-07-11數(shù)據(jù)透視表中兩列相乘合計(jì)的實(shí)用指南? 在數(shù)據(jù)分析的日常工作中,數(shù)據(jù)透視表憑借其強(qiáng)大的數(shù)據(jù)匯總和分析功能,成為了 Excel 用戶 ...
2025-07-11尊敬的考生: 您好! 我們誠(chéng)摯通知您,CDA Level I和 Level II考試大綱將于 2025年7月25日 實(shí)施重大更新。 此次更新旨在確保認(rèn) ...
2025-07-10BI 大數(shù)據(jù)分析師:連接數(shù)據(jù)與業(yè)務(wù)的價(jià)值轉(zhuǎn)化者? ? 在大數(shù)據(jù)與商業(yè)智能(Business Intelligence,簡(jiǎn)稱 BI)深度融合的時(shí)代,BI ...
2025-07-10SQL 在預(yù)測(cè)分析中的應(yīng)用:從數(shù)據(jù)查詢到趨勢(shì)預(yù)判? ? 在數(shù)據(jù)驅(qū)動(dòng)決策的時(shí)代,預(yù)測(cè)分析作為挖掘數(shù)據(jù)潛在價(jià)值的核心手段,正被廣泛 ...
2025-07-10數(shù)據(jù)查詢結(jié)束后:分析師的收尾工作與價(jià)值深化? ? 在數(shù)據(jù)分析的全流程中,“query end”(查詢結(jié)束)并非工作的終點(diǎn),而是將數(shù) ...
2025-07-10CDA 數(shù)據(jù)分析師考試:從報(bào)考到取證的全攻略? 在數(shù)字經(jīng)濟(jì)蓬勃發(fā)展的今天,數(shù)據(jù)分析師已成為各行業(yè)爭(zhēng)搶的核心人才,而 CDA(Certi ...
2025-07-09【CDA干貨】單樣本趨勢(shì)性檢驗(yàn):捕捉數(shù)據(jù)背后的時(shí)間軌跡? 在數(shù)據(jù)分析的版圖中,單樣本趨勢(shì)性檢驗(yàn)如同一位耐心的偵探,專注于從單 ...
2025-07-09year_month數(shù)據(jù)類型:時(shí)間維度的精準(zhǔn)切片? ? 在數(shù)據(jù)的世界里,時(shí)間是最不可或缺的維度之一,而year_month數(shù)據(jù)類型就像一把精準(zhǔn) ...
2025-07-09CDA 備考干貨:Python 在數(shù)據(jù)分析中的核心應(yīng)用與實(shí)戰(zhàn)技巧? ? 在 CDA 數(shù)據(jù)分析師認(rèn)證考試中,Python 作為數(shù)據(jù)處理與分析的核心 ...
2025-07-08SPSS 中的 Mann-Kendall 檢驗(yàn):數(shù)據(jù)趨勢(shì)與突變分析的有力工具? ? ? 在數(shù)據(jù)分析的廣袤領(lǐng)域中,準(zhǔn)確捕捉數(shù)據(jù)的趨勢(shì)變化以及識(shí)別 ...
2025-07-08備戰(zhàn) CDA 數(shù)據(jù)分析師考試:需要多久?如何規(guī)劃? CDA(Certified Data Analyst)數(shù)據(jù)分析師認(rèn)證作為國(guó)內(nèi)權(quán)威的數(shù)據(jù)分析能力認(rèn)證 ...
2025-07-08LSTM 輸出不確定的成因、影響與應(yīng)對(duì)策略? 長(zhǎng)短期記憶網(wǎng)絡(luò)(LSTM)作為循環(huán)神經(jīng)網(wǎng)絡(luò)(RNN)的一種變體,憑借獨(dú)特的門控機(jī)制,在 ...
2025-07-07統(tǒng)計(jì)學(xué)方法在市場(chǎng)調(diào)研數(shù)據(jù)中的深度應(yīng)用? 市場(chǎng)調(diào)研是企業(yè)洞察市場(chǎng)動(dòng)態(tài)、了解消費(fèi)者需求的重要途徑,而統(tǒng)計(jì)學(xué)方法則是市場(chǎng)調(diào)研數(shù) ...
2025-07-07CDA數(shù)據(jù)分析師證書考試全攻略? 在數(shù)字化浪潮席卷全球的當(dāng)下,數(shù)據(jù)已成為企業(yè)決策、行業(yè)發(fā)展的核心驅(qū)動(dòng)力,數(shù)據(jù)分析師也因此成為 ...
2025-07-07剖析 CDA 數(shù)據(jù)分析師考試題型:解鎖高效備考與答題策略? CDA(Certified Data Analyst)數(shù)據(jù)分析師考試作為衡量數(shù)據(jù)專業(yè)能力的 ...
2025-07-04SQL Server 字符串截取轉(zhuǎn)日期:解鎖數(shù)據(jù)處理的關(guān)鍵技能? 在數(shù)據(jù)處理與分析工作中,數(shù)據(jù)格式的規(guī)范性是保證后續(xù)分析準(zhǔn)確性的基礎(chǔ) ...
2025-07-04CDA 數(shù)據(jù)分析師視角:從數(shù)據(jù)迷霧中探尋商業(yè)真相? 在數(shù)字化浪潮席卷全球的今天,數(shù)據(jù)已成為企業(yè)決策的核心驅(qū)動(dòng)力,CDA(Certifie ...
2025-07-04CDA 數(shù)據(jù)分析師:開啟數(shù)據(jù)職業(yè)發(fā)展新征程? ? 在數(shù)據(jù)成為核心生產(chǎn)要素的今天,數(shù)據(jù)分析師的職業(yè)價(jià)值愈發(fā)凸顯。CDA(Certified D ...
2025-07-03