多樣性數據源在報表開發中越來越常見,潤乾集算報表對多樣性數據源的有效支持使得這類報表開發變得非常簡單,目前集算報表支持的數據源類型除傳統的關系型數據庫外,還支持:TXT文本、Excel、JSON、HTTP、Hadoop、mongodb等。
這裡通過兩個例子介紹集算報表使用文本數據源制作報表的步驟,對於小文本文件和大文本文件在集算報表中可以采用不同的方式進行處理。
股票交易記錄按月以文本形式存儲,文件名為stock_record_yyyyMM.txt(如stock_record_200901.txt),文本內容包括股票代碼、交易日期和收盤價。現根據指定日期精確查詢某一只或幾只股票的收盤價,以便進行股價趨勢分析。文本內容如下:
code tradingDate price
120089 2009-01-0100:00:00 50.24
120123 2009-01-0100:00:00 10.35
120136 2009-01-0100:00:00 43.37
120141 2009-01-0100:00:00 41.86
120170 2009-01-0100:00:00 194.63
報表樣式如下:
<喎?http://www.Bkjia.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KPHA+ICAgICAgIMrkyOuy6dGvyNXG2rrNucnGsbT6wuujrLLp0a+1vbXEvbvS19DFz6KjujwvcD4KPHA+PGltZyBzcmM9"http://www.2cto.com/uploadfile/Collfiles/20150506/2015050610101616.jpg" alt="\">
由於某天的股價信息只會存在一個文件中(按月存儲),單個文件數據量並不是很大,因而可以將文件一次性加載到內存中完成數據查詢。這裡我們也將能夠一次性讀入內存進行計算的文件稱為小文本文件。以下為具體實現:
使用集算編輯器編寫腳本(p1.dfx),完成文件讀入和數據過濾,為報表返回結果集。由於要接收報表傳遞的參數,首先設置腳本腳本參數。
編輯腳本內容(右側為格子運行後結果):
A1:根據日期參數導入指定文件(一個);這裡使用了f.import()將文本數據一次性讀入內存,采用全內存方式完成數據計算,這也是處理小文件的常用方法;
A2:根據指定日期和股票代碼查詢交易記錄;
A3:為報表返回結果集。
使用集算報表設計器新建報表模板,並設置參數:
設置數據集,使用“集算器”數據集類型,調用編輯好的腳本文件(p1.dfx)
其中,dfx文件路徑既可以是絕對路徑,也可以是相對路徑,相對路徑是相對選項中配置的dfx主目錄的。
編輯報表表達式,直接使用集算腳本返回的結果集,不再在報表中過濾,完成報表制作。
通過上面的實現可以看到,使用集算器腳本可以很方便地完成文本文件的讀取計算,而且外置的集算腳本具有可視化的編輯調試環境,編輯好的腳本還可以復用(被其他報表或程序調用)。不過,如果腳本已經調試好,而且不需要復用的時候,要維護兩個文件(集算腳本和報表模板)的一致性會比較麻煩,這時候直接使用集算報表的腳本數據集就比較簡單了。
在腳本數據集中可以分步編寫腳本完成計算任務,語法與集算器一致,還可以直接使用報表定義好的數據源(本例並未涉及)和參數。可以這樣使用腳本數據集替代集算器數據集(集算腳本)部分(報表參數、表達式等部分與使用集算器數據集時完全一致,不再贅述):
直接使用報表定義的參數date和code。
除了可以用小文本文件做為報表數據源,集算報表還可以讀取大文本文件(無法一次性讀入內存進行計算)。與小文本處理方式不同,集算報表采用外存計算的方式來處理大文件,這裡也通過實例來說明。
我們更改一下上面的報表需求,要求可以查詢指定時間段的某些股票交易信息。由於時間跨度可大可小,所以需要讀入的文件可能很多,這時無法將多個文件一次性加載到內存中進行計算,需要使用處理大文本的外存計算方式。以下為具體實現:
設置腳本參數。
編輯腳本內容(右側為格子運行後結果)。
A1:根據日期范圍計算需要查詢的月份,以確定用到的文件;
A2:循環所有月份,使用f.cursor()建立文件游標,並通過cs.conj@x()將多個游標合並為一個;與使用f.import()一次性讀入內存不同,文件游標只是外存文件的引用,並未實際讀入數據;
A3:根據參數進行過濾,仍然返回游標;
A4:使用cs.fetch()通過游標取出結果後為報表返回。
設置報表參數。
設置數據集。
編輯報表表達式。
通過以上步驟即可完成大文件的讀取計算。集算報表提供內外存不同的處理方式可以滿足用戶不同的報表需求,為文本文件數據源報表開發提供幫助。