結(jié)構(gòu)化文本是很常見(jiàn)的文件格式,對(duì)結(jié)構(gòu)化文本的計(jì)算也是很常見(jiàn)的需求。在實(shí)現(xiàn)這種計(jì)算時(shí),一種很容易想到的辦法是將文件導(dǎo)入數(shù)據(jù)庫(kù)后再計(jì)算,但這會(huì)消耗大量時(shí)間以及昂貴的數(shù)據(jù)庫(kù)資源,而且有的場(chǎng)合下并沒(méi)有合適的數(shù)據(jù)庫(kù)可用。這樣一來(lái),我們就會(huì)有一個(gè)自然的想法,如果能夠直接計(jì)算就會(huì)方便多了??上У氖?,一般高級(jí)語(yǔ)言都沒(méi)有提供針對(duì)結(jié)構(gòu)化文本的基本運(yùn)算類(lèi)庫(kù),而想要通過(guò)硬編碼完成這些運(yùn)算又非常繁瑣,不僅代碼復(fù)雜,可維護(hù)性還很差。
成都創(chuàng)新互聯(lián)專(zhuān)注于海寧企業(yè)網(wǎng)站建設(shè),成都響應(yīng)式網(wǎng)站建設(shè),成都商城網(wǎng)站開(kāi)發(fā)。海寧網(wǎng)站建設(shè)公司,為海寧等地區(qū)提供建站服務(wù)。全流程定制開(kāi)發(fā),專(zhuān)業(yè)設(shè)計(jì),全程項(xiàng)目跟蹤,成都創(chuàng)新互聯(lián)專(zhuān)業(yè)和態(tài)度為您提供的服務(wù)作為專(zhuān)業(yè)的結(jié)構(gòu)化數(shù)據(jù)計(jì)算類(lèi)庫(kù),集算器SPL封裝了豐富的結(jié)構(gòu)化計(jì)算函數(shù),支持集合運(yùn)算、關(guān)聯(lián)運(yùn)算、有序運(yùn)算,因此可輕松實(shí)現(xiàn)結(jié)構(gòu)化文本的運(yùn)算。此外,SPL還可以通過(guò)JDBC調(diào)用接口向Java應(yīng)用提供運(yùn)算結(jié)果(可參考【Java 如何調(diào)用 SPL 腳本】),極大地方便集成工作。
下面我們就來(lái)看一下常見(jiàn)的結(jié)構(gòu)化文本計(jì)算案例,以及SPL對(duì)應(yīng)的解法。
在sales.txt的第2行插入1條記錄。源文件如下:
OrderID | Client | SellerId | Amount | OrderDate |
26 | TAS | 1 | 2142.4 | 2009-08-05 |
33 | DSGC | 1 | 613.2 | 2009-08-14 |
84 | GC | 1 | 88.5 | 2009-10-16 |
133 | HU | 1 | 1419.8 | 2010-12-12 |
32 | JFS | 3 | 468 | 2009-08-13 |
39 | NR | 3 | 3016 | 2010-08-21 |
43 | KT | 3 | 2169 | 2009-08-27 |
代碼
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.insert(2,200,"MS",20,2000,date("2015-02-02")) |
3 | =file("D:\\sales.txt").export@t(A1) |
結(jié)果????
OrderID | Client | SellerId | Amount | OrderDate |
26 | TAS | 1 | 2142.4 | 2009-08-05 |
200 | MS | 20 | 2000 | 2015-02-02 |
33 | DSGC | 1 | 613.2 | 2009-08-14 |
84 | GC | 1 | 88.5 | 2009-10-16 |
133 | HU | 1 | 1419.8 | 2010-12-12 |
32 | JFS | 3 | 468 | 2009-08-13 |
39 | NR | 3 | 3016 | 2010-08-21 |
43 | KT | 3 | 2169 | 2009-08-27 |
函數(shù)insert插入記錄,第1個(gè)參數(shù)是插入位置,當(dāng)該參數(shù)為0時(shí),表示追加記錄。
如果只是向文件追加記錄,那么不必讀入文件,只需用函數(shù)export@a,代碼如下:
A | |
1 | =create(OrderID,Client,SellerId,Amount,OrderDate).record([200,"MS",20,2000,date("2015-02-02")]) |
2 | =file("D:\\sales.txt").export@a(A1) |
函數(shù)create新建二維表,函數(shù)record向二維表追加記錄。
另外,可以通過(guò)insert@r批量插入記錄,代碼如下:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =create(OrderID,Client,SellerId,Amount,OrderDate) |
3 | =A2.record([200,"MS",20,2000,date("2015-02-02"), 300,"Ora",30,3000,date("2015-03-03")]) |
4 | =A1.insert@r(2:A2) |
為節(jié)省篇幅起見(jiàn),下文都將省略導(dǎo)出文件的代碼。
刪除sales.txt中的第2條記錄。代碼如下:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.delete(2) |
函數(shù)delete支持批量刪除,比如刪除第2,3,5,6,7條記錄:A1.delete([2,3]|to(5,7))
也可以按條件刪除,比如刪除Amount小于1000的記錄:A1.delete(A1.select(Amount<1000))
修改sales.txt的第2條記錄,將SellerId改為100,Amount改為1000,代碼如下:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.modify(2,100:SellerId,1000:Amount) |
也可以批量修改,比如將前10條記錄的Amount增加10:
A1.modify(1:10,Amount+10:Amount)
在sales.txt增加列year,填入訂單日期OrerDate中的年份。代碼:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.derive(year(OrderDate):year) |
結(jié)果:
物理上刪除列效率較低,通常用“取出保留列”來(lái)代替。比如sales.txt中刪除Client、SellerId,相當(dāng)于保留OrderID、Amount、OrderDate,代碼如下:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.new(OrderID,Amount,OrderDate) |
結(jié)果:
將sales.txt的Amount列增加10%,代碼如下:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.run(Amount*1.1:Amount) |
結(jié)果:
注意函數(shù)run跟函數(shù)modify的區(qū)別:修改整列(所有記錄的對(duì)應(yīng)字段)需要用run,只修改指定記錄的某列(特定字段)用modify。
指定時(shí)間段,按參數(shù)查詢(xún)sales.txt。代碼:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.select(OrderDate>=startDate ? && OrderDate<=endDate) |
startDate和endDate是輸入?yún)?shù),比如2010-01-01至2010-12-31。結(jié)果:
針對(duì)sales.txt,按照客戶(hù)代碼(Client)降序排序,按照訂單日期(OrderDate)升序排序。
代碼:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.sort(-Client,OrderDate) |
注意:降序時(shí)在字段前面使用英文的減號(hào)來(lái)表示,即“-”,默認(rèn)按照升序。
結(jié)果:
計(jì)算出每個(gè)銷(xiāo)售員每年的銷(xiāo)售額和訂單數(shù),即按照銷(xiāo)售員分組,對(duì)銷(xiāo)售額求和,對(duì)記錄計(jì)數(shù)。
代碼:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.groups(SellerId,year(OrderDate);sum(Amount),count(~)) |
函數(shù)groups可在分組的同時(shí)進(jìn)行匯總,其中,~表示每組或當(dāng)前組,count(~)等于count(OrderID)。
結(jié)果:
列出sales.txt中的客戶(hù)名單,即獲取所有Client的唯一值。
代碼:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.id(Client) |
結(jié)果:
保留sales.txt中每個(gè)客戶(hù)每個(gè)銷(xiāo)售員的第一條記錄。獲取唯一值也是一種去重,這里是另外一種通過(guò)分組來(lái)去除重復(fù)的方式。
代碼:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.group@1(Client,SellerId) |
通過(guò)函數(shù)group進(jìn)行分組(和groups不同,這里可以不匯總),@1表示取每組第1條記錄。
結(jié)果:
找到每個(gè)銷(xiāo)售員銷(xiāo)售額大的3筆訂單。
代碼:
A | |
1 | =file("D:\\sales.txt").import@t() |
2 | =A1.group(SellerId;~.top(3;-Amount):t).conj(t) |
函數(shù)top過(guò)濾出TopN,”-”表示逆序,函數(shù)conj用于合并結(jié)果。
計(jì)算結(jié)果:
如果只取大的一筆訂單,還可以用maxp函數(shù),不過(guò) maxp直接返回表達(dá)式描述的大記錄,因此不用再加符號(hào)”-”來(lái)描述排序方式。由于分組后的字段t的內(nèi)容是記錄,因此不能用conj(t)來(lái)合并,而是需要使用A.(t)方式直接取出t字段。所以取每個(gè)銷(xiāo)售的大一筆訂單表達(dá)式為:=A1.group(SellerId;~.maxp(Amount):t).(t)
另外有需要云服務(wù)器可以了解下創(chuàng)新互聯(lián)scvps.cn,海內(nèi)外云服務(wù)器15元起步,三天無(wú)理由+7*72小時(shí)售后在線(xiàn),公司持有idc許可證,提供“云服務(wù)器、裸金屬服務(wù)器、高防服務(wù)器、香港服務(wù)器、美國(guó)服務(wù)器、虛擬主機(jī)、免備案服務(wù)器”等云主機(jī)租用服務(wù)以及企業(yè)上云的綜合解決方案,具有“安全穩(wěn)定、簡(jiǎn)單易用、服務(wù)可用性高、性?xún)r(jià)比高”等特點(diǎn)與優(yōu)勢(shì),專(zhuān)為企業(yè)上云打造定制,能夠滿(mǎn)足用戶(hù)豐富、多元化的應(yīng)用場(chǎng)景需求。
本文題目:結(jié)構(gòu)化文本計(jì)算示例(一)-創(chuàng)新互聯(lián)
標(biāo)題URL:http://muchs.cn/article34/dheepe.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、域名注冊(cè)、網(wǎng)站導(dǎo)航、虛擬主機(jī)、移動(dòng)網(wǎng)站建設(shè)、App設(shè)計(jì)
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶(hù)投稿、用戶(hù)轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話(huà):028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來(lái)源: 創(chuàng)新互聯(lián)
猜你還喜歡下面的內(nèi)容