天天看點

文本導出的方方面面

TXT文本檔案是我們常用的在應用之間傳遞資料的途徑之一,因為它具有通用、靈活、易維護等諸多優點。不過并不是所有應用都提供了生成txt檔案的功能,往往需要額外的程式設計和開發工作才能獲得。這時如果能夠有一個通用的工具軟體,靈活地根據需要生成目标格式的文本,将能夠極大地助力我們的業務工作。本文介紹的集算器就正是這樣一款高效、靈活的通用工具軟體,能夠從不同資料源讀取、計算并導出txt檔案。

本文将着重介紹集算器的資料導出能力,而集算器本身強大的計算能力不是本文重點,是以文中沒有刻意介紹資料源通路和計算過程。文中用到的函數請參看集算器文檔《函數參考.chm》。

1.        簡單導出資料

我們首先從簡單的資料導出開始介紹:

1.1   導出新檔案

下面這個例子中,通過兩行簡單讀入和輸出,完成了從資料源到TXT檔案的導出。

A1單元格讀入excel檔案中的5年1班學生成績,用來模拟可能通過計算得到的資料。

A2中的表達式将A1的資料導出到一個新的 “學生成績表.txt”檔案中。例子中使用了導出函數export。不過在這個最簡單的例子中,我們沒有指定額外的參數。由于沒有指定x和F,是以将導出A1中的所有字段,同時保持字段名不變。由于沒有指定列分隔符參數s,是以會用預設的tab分隔。不過函數使用了選項@t,是以會将字段名(excel檔案的标題行)導出到第一行。

文本導出的方方面面

下圖中就是導出的txt檔案:

文本導出的方方面面

1.2   追加資料

假如“學生成績表.txt”檔案已經存在,我們需要在檔案中再增加另一個班的成績,那麼應該怎麼做呢?

與上例類似,在A1中讀入要追加的5年2班的學生成績,資料結構保持相同

A2中把資料導出到已有的“學生成績表.txt”檔案中,不過這時因為檔案中已有标題,隻需導出資料,是以不要加函數選項@t。同時,通過選項@a指明追加資料。

文本導出的方方面面

1.3   導出 csv

csv檔案也是常見的純文字檔案,其中存儲的表格資料以逗号分隔。如果要導出csv檔案,有兩種方式:

l   在導出時象下圖那樣加選項@c,或者

l   增加分隔參數,寫成export@t(A1;",")

兩種方式結果都是一樣的。

文本導出的方方面面

導出結果如下:

學号,姓名,班級,性别,國文,數學,英語

110210,徐趙亞,5(1),男,80,60,86

110211,王莼禮,5(1),男,81,72,67

110212,沈花容,5(1),女,97,91,87

110213,李曉梅,5(1),女,86,69,73

2.        複雜導出資料

現在,我們看一下略為複雜的導出操作:

在上面的例子中我們引入一些新的需求:

l   在結果檔案中增加一個序号列

l   在最後增加一個平均成績列,并對平均成績進行格式化保留一位小數

l   不導出學号

l   列間分隔符采用“t| ”。

文本導出的方方面面

導出結果如下圖所示:

文本導出的方方面面

還是兩行搞定!A1不用再說了,我們來看看A2的變化:#号在序表中表示記錄編号,将它導出為結果中的序号列;指明導出姓名、班級、性别、國文、數學、英語列;表達式“string((國文 + 數學 + 英語 )/3,"#.0"): 平均”中,求出國文、數學、英語的平均數并格式化成隻保留一位小數,命名導出的新列名為“平均”;最後一個參數指定列間分隔符為“t| ”。

3.        導出大量資料

資料導出時還常常要面臨另一個重要問題:如果資料量很大時又該怎麼辦?

為此,可以利用集算器提供的遊标功能來處理大資料量的情況,遊标在讀取資料時從前向後周遊一次,逐條從資料源讀取資料,而不是一次将所有資料讀入記憶體,是以不會受到記憶體不足的限制。而且,集算器遊标不僅可以應用于資料庫,還可以應用于資料檔案或者記憶體排列。

腳本如下圖所示:

文本導出的方方面面
文本導出的方方面面

A1連接配接demo資料庫

A2打開訂單表作為遊标

A3定義序号變量n,賦初值為0

A4是具體的導出過程,将遊标所指的大資料導出到big.txt檔案中。

對于大資料量的情況我們把遊标作為導出資料源,而在前面的普通導出情況下則是把序表作為導出資料源。除了遊标中不能以#代表記錄号自動産生序号以外,兩者用法完全相同。

為了産生序号,導出時利用A3中定義的變量n,在每導出一條資料時加1後導出為序号列即可。

4.        工資助手

最後,我們來看一個真正實戰的例子:

當今企業給員工發工資一般都通過銀行代發的方式。銀行都提供了網上服務,企業可以通過這個途徑來完成自助工資發放,具體的做法是:

銀行提供了一個代發工資的文本檔案格式,企業使用者隻要按格式編寫此檔案,再通過網上銀行上載此檔案,就可以完成工資發放。

下面我們就來看看如何利用集算器友善地完成代發工資文本檔案的生成。

我們以民生銀行為例,其檔案格式如下:

ATNU:0019999

MICN:

CUNM:北京 XXXX 技術有限公司

MIAC:0110014180030254

EYMD:1

TOAM:80576.39

COUT:5

6226220101871111|19944.65|趙愛潤 ||

6226220101872222|18349.08|孫學乾 ||

6226220101873333|15955.72|王老集 ||

6226220101874444|14360.15|張小算 ||

6226220101875555|11966.79|李大器 ||

此檔案前 8 行是檔案頭,第 1、2、5、8 行内容固定不變,第 3 行是企業名稱,第 4 行是企業在民生銀行的賬号,第 6 行是本次發工資的總金額,第 7 行是發工資的總筆數。從第 9 行開始是具體的工資資訊,第一項是員工工資賬号,第二項是工資金額,第三項是員工姓名,第四、五項空着不填就行。各項之間用豎線分隔。

此文本檔案的格式要求非常嚴格,不能出錯,是以不适合财務人員直接編輯,需要通過程式生成。

企業與工資相關的有兩個 excel 表,一個是員工表,另一個是工資表,如下兩圖所示。

文本導出的方方面面
文本導出的方方面面

賬務人員負責填好員工工資表後,就可以打開集算器 ide,運作預先編寫好的 dfx 程式了:

文本導出的方方面面

A1中讀入編寫的員工表

B1中讀入編寫的工資表

A2中按姓名将兩張表合并成一張表

A3打開要儲存的代發工資檔案

從 A4 到 B7 中逐行寫入檔案頭:其中:B6 是工資總額,從 A2 中算出銀行實發總額填入;A7 是本次代發的總筆數。

在 A8 中導出生成代發工資檔案,分别是工資卡号、工資金額、姓名、空列、空列 (最後兩列是不需要填的,是以用備注列代表)。

腳本中除了 A4 格是用替換寫入以外,其它格都用了 @a 選項,表示是追加寫入。

至于其它銀行,過程大緻與此類似。隻要根據銀行對文本檔案格式的說明,編寫好集算器 dfx 程式就可以了。

簡單總結一下,在資料導出過程中,集算器提供了 write()和 export() 兩個函數,前者是逐行寫入,後者是批量寫入。函數提供了參數和函數選項兩種控制方法,使用不同的參數或函數選項,我們可以指定是否導出字段名 / 标題、是否導出所有字段、是否使用新的字段名、追加還是替換檔案、使用哪個字元做分隔參數等等選擇。

在見證了資料導出過程中集算器強大而靈活的能力後,是不是也有了莫名的沖動呢?趕快下載下傳集算器,加入共同探索、一起變強的行列吧!

作者:KittyYan

連結:

http://c.raqsoft.com.cn/article/1535963006409

來源:乾學院

著作權歸作者所有。商業轉載請聯系作者獲得授權,非商業轉載請注明出處。