99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀[從產(chǎn)品角度學(xué)EXCEL 02]-EXCEL里的樹形結(jié)構(gòu)
[從產(chǎn)品角度學(xué)EXCEL 02]-EXCEL里的樹形結(jié)構(gòu)
2017-01-12
收藏

[從產(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

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測(cè)極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }