結構化文本計算示例(一)

結構化文本是很常見的文件格式,對結構化文本的計算也是很常見的需求。在實現這種計算時,一種很容易想到的辦法是將文件導入數據庫後再計算,但這會消耗大量時間以及昂貴的數據庫資源,並且有的場合下並無合適的數據庫可用。這樣一來,咱們就會有一個天然的想法,若是可以直接計算就會方便多了。惋惜的是,通常高級語言都沒有提供針對結構化文本的基本運算類庫,而想要經過硬編碼完成這些運算又很是繁瑣,不只代碼複雜,可維護性還不好。數據庫

做爲專業的結構化數據計算類庫,集算器SPL封裝了豐富的結構化計算函數,支持集合運算、關聯運算、有序運算,所以可輕鬆實現結構化文本的運算。此外,SPL還能夠經過JDBC調用接口向Java應用提供運算結果(可參考【Java 如何調用 SPL 腳本】),極大地方便集成工做。ide

下面咱們就來看一下常見的結構化文本計算案例,以及SPL對應的解法。函數


維護

增長記錄

         在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

         代碼3d


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)

         

結果    blog

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

函數insert插入記錄,第1個參數是插入位置,當該參數爲0時,表示追加記錄。
排序

         若是隻是向文件追加記錄,那麼沒必要讀入文件,只需用函數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)

函數create新建二維表,函數record向二維表追加記錄。資源

另外,能夠經過insert@r批量插入記錄,代碼以下:get


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)

         爲節省篇幅起見,下文都將省略導出文件的代碼。

刪除記錄

         刪除sales.txt中的第2條記錄。代碼以下:


A
1 =file("D:\\sales.txt").import@t()
2 =A1.delete(2)

         函數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)

         結果:

1559539163195100.png

刪除列

         物理上刪除列效率較低,一般用「取出保留列」來代替。好比sales.txt中刪除Client、SellerId,至關於保留OrderID、Amount、OrderDate,代碼以下:


A
1 =file("D:\\sales.txt").import@t()
2 =A1.new(OrderID,Amount,OrderDate)

         結果:

1559539163275100.png

修改列

         將sales.txt的Amount列增長10%,代碼以下:


A
1 =file("D:\\sales.txt").import@t()
2 =A1.run(Amount*1.1:Amount)

結果:

1559539163336100.png

         注意函數run跟函數modify的區別:修改整列(全部記錄的對應字段)須要用run,只修改指定記錄的某列(特定字段)用modify。

 

基本運算

查詢

         指定時間段,按參數查詢sales.txt。代碼:


A
1 =file("D:\\sales.txt").import@t()
2 =A1.select(OrderDate>=startDate   && OrderDate<=endDate)

         startDate和endDate是輸入參數,好比2010-01-01至2010-12-31。結果:

1559539162632100.png

排序

針對sales.txt,按照客戶代碼(Client)降序排序,按照訂單日期(OrderDate)升序排序。

代碼:


A
1 =file("D:\\sales.txt").import@t()
2 =A1.sort(-Client,OrderDate)

注意:降序時在字段前面使用英文的減號來表示,即「-」,默認按照升序。

結果:

1559539162739100.png

分組彙總

計算出每一個銷售員每一年的銷售額和訂單數,即按照銷售員分組,對銷售額求和,對記錄計數。

代碼:


A
1 =file("D:\\sales.txt").import@t()
2 =A1.groups(SellerId,year(OrderDate);sum(Amount),count(~))

函數groups可在分組的同時進行彙總,其中,~表示每組或當前組,count(~)等於count(OrderID)。

結果:

1559539162825100.png

得到惟一值

列出sales.txt中的客戶名單,即獲取全部Client的惟一值。

代碼:


A
1 =file("D:\\sales.txt").import@t()
2 =A1.id(Client)

結果:

1559539162933100.png

去除重複

保留sales.txt中每一個客戶每一個銷售員的第一條記錄。獲取惟一值也是一種去重,這裏是另一種經過分組來去除重複的方式。

代碼:


A
1 =file("D:\\sales.txt").import@t()
2 =A1.group@1(Client,SellerId)

經過函數group進行分組(和groups不一樣,這裏能夠不彙總),@1表示取每組第1條記錄。

結果:

1559539163026100.png

 

TopN

         找到每一個銷售員銷售額最大的3筆訂單。

代碼:


A
1 =file("D:\\sales.txt").import@t()
2 =A1.group(SellerId;~.top(3;-Amount):t).conj(t)

函數top過濾出TopN,」-」表示逆序,函數conj用於合併結果。

計算結果:

1559539163107100.png

若是隻取最大的一筆訂單,還能夠用maxp函數,不過 maxp直接返回表達式描述的最大記錄,所以不用再加符號」-」來描述排序方式。因爲分組後的字段t的內容是記錄,所以不能用conj(t)來合併,而是須要使用A.(t)方式直接取出t字段。因此取每一個銷售的最大一筆訂單表達式爲:=A1.group(SellerId;~.maxp(Amount):t).(t)

相關文章
相關標籤/搜索