TXT文本文件是我們常用的在應(yīng)用之間傳遞數(shù)據(jù)的途徑之一,因為它具有通用、靈活、易維護(hù)等諸多優(yōu)點。不過并不是所有應(yīng)用都提供了生成txt文件的功能,往往需要額外的程序設(shè)計和開發(fā)工作才能獲得。這時如果能夠有一個通用的工具軟件,靈活地根據(jù)需要生成目標(biāo)格式的文本,將能夠極大地助力我們的業(yè)務(wù)工作。本文介紹的集算器就正是這樣一款高效、靈活的通用工具軟件,能夠從不同數(shù)據(jù)源讀取、計算并導(dǎo)出txt文件。
成都創(chuàng)新互聯(lián)公司從2013年創(chuàng)立,先為山東等服務(wù)建站,山東等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為山東企業(yè)網(wǎng)站制作PC+手機+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。
本文將著重介紹集算器的數(shù)據(jù)導(dǎo)出能力,而集算器本身強大的計算能力不是本文重點,因此文中沒有刻意介紹數(shù)據(jù)源訪問和計算過程。文中用到的函數(shù)請參看集算器在線文檔《函數(shù)參考》。
我們首先從簡單的數(shù)據(jù)導(dǎo)出開始介紹:
下面這個例子中,通過兩行簡單讀入和輸出,完成了從數(shù)據(jù)源到TXT文件的導(dǎo)出。
A1單元格讀入excel文件中的5年1班學(xué)生成績,用來模擬可能通過計算得到的數(shù)據(jù)。
A2中的表達(dá)式將A1的數(shù)據(jù)導(dǎo)出到一個新的 “學(xué)生成績表.txt”文件中。例子中使用了導(dǎo)出函數(shù)export。不過在這個最簡單的例子中,我們沒有指定額外的參數(shù)。由于沒有指定x和F,因此將導(dǎo)出A1中的所有字段,同時保持字段名不變。由于沒有指定列分隔符參數(shù)s,所以會用默認(rèn)的tab分隔。不過函數(shù)使用了選項@t,因此會將字段名(excel文件的標(biāo)題行)導(dǎo)出到第一行。
A | |
1 | =file("51.xlsx").xlsimport@t() |
2 | =file( "學(xué)生成績表.txt" ).export@t(A1) |
下圖中就是導(dǎo)出的txt文件:
假如“學(xué)生成績表.txt”文件已經(jīng)存在,我們需要在文件中再增加另一個班的成績,那么應(yīng)該怎么做呢?
與上例類似,在A1中讀入要追加的5年2班的學(xué)生成績,數(shù)據(jù)結(jié)構(gòu)保持相同
A2中把數(shù)據(jù)導(dǎo)出到已有的“學(xué)生成績表.txt”文件中,不過這時因為文件中已有標(biāo)題,只需導(dǎo)出數(shù)據(jù),因此不要加函數(shù)選項@t。同時,通過選項@a指明追加數(shù)據(jù)。
A | |
1 | =file("52.xlsx").xlsimport@t() |
2 | =file( "學(xué)生成績表.txt" ).export@a(A1) |
csv文件也是常見的純文本文件,其中存儲的表格數(shù)據(jù)以逗號分隔。如果要導(dǎo)出csv文件,有兩種方式:
l 在導(dǎo)出時象下圖那樣加選項@c,或者
l 增加分隔參數(shù),寫成export@t(A1;",")
兩種方式結(jié)果都是一樣的。
A | |
1 | =file("51.xlsx").xlsimport@t() |
2 | =file( "學(xué)生成績表.txt" ).export@tc(A1) |
導(dǎo)出結(jié)果如下:
學(xué)號,姓名,班級,性別,語文,數(shù)學(xué),英語
110210,徐趙亞,5(1),男,80,60,86
110211,王莼禮,5(1),男,81,72,67
110212,沈花容,5(1),女,97,91,87
110213,李曉梅,5(1),女,86,69,73
現(xiàn)在,我們看一下略為復(fù)雜的導(dǎo)出操作:
在上面的例子中我們引入一些新的需求:
l 在結(jié)果文件中增加一個序號列
l 在最后增加一個平均成績列,并對平均成績進(jìn)行格式化保留一位小數(shù)
l 不導(dǎo)出學(xué)號
l 列間分隔符采用“\t| ”。
A | |
1 | =file("51.xlsx").xlsimport@t() |
2 | =file( "學(xué)生成績表.txt" ).export@t(A1,#: 序號, 姓名, 班級, 性別, 語文, 數(shù)學(xué), 英語,string(( 語文 + 數(shù)學(xué) + 英語)/3,"#.0"): 平均;"\t| ") |
導(dǎo)出結(jié)果如下圖所示:
還是兩行搞定!A1不用再說了,我們來看看A2的變化:#號在序表中表示記錄編號,將它導(dǎo)出為結(jié)果中的序號列;指明導(dǎo)出姓名、班級、性別、語文、數(shù)學(xué)、英語列;表達(dá)式“string((語文 + 數(shù)學(xué) + 英語 )/3,"#.0"): 平均”中,求出語文、數(shù)學(xué)、英語的平均數(shù)并格式化成只保留一位小數(shù),命名導(dǎo)出的新列名為“平均”;最后一個參數(shù)指定列間分隔符為“\t| ”。
數(shù)據(jù)導(dǎo)出時還常常要面臨另一個重要問題:如果數(shù)據(jù)量很大時又該怎么辦?
為此,可以利用集算器提供的游標(biāo)功能來處理大數(shù)據(jù)量的情況,游標(biāo)在讀取數(shù)據(jù)時從前向后遍歷一次,逐條從數(shù)據(jù)源讀取數(shù)據(jù),而不是一次將所有數(shù)據(jù)讀入內(nèi)存,因此不會受到內(nèi)存不足的限制。而且,集算器游標(biāo)不僅可以應(yīng)用于數(shù)據(jù)庫,還可以應(yīng)用于數(shù)據(jù)文件或者內(nèi)存排列。
腳本如下圖所示:
A | |
1 | =connect("demo") |
2 | =A1.cursor("select * from 訂單表") |
3 | >n=0 |
4 | =file("big.txt").export@t(A2,n=n+1:序號, 訂單 ID, 公司名稱, 貨主地區(qū), 訂購日期,string(訂單金額,"#.00"): 訂單金額 ) |
導(dǎo)出結(jié)果如下:
A1連接demo數(shù)據(jù)庫
A2打開訂單表作為游標(biāo)
A3定義序號變量n,賦初值為0
A4是具體的導(dǎo)出過程,將游標(biāo)所指的大數(shù)據(jù)導(dǎo)出到big.txt文件中。
對于大數(shù)據(jù)量的情況我們把游標(biāo)作為導(dǎo)出數(shù)據(jù)源,而在前面的普通導(dǎo)出情況下則是把序表作為導(dǎo)出數(shù)據(jù)源。除了游標(biāo)中不能以#代表記錄號自動產(chǎn)生序號以外,兩者用法完全相同。
為了產(chǎn)生序號,導(dǎo)出時利用A3中定義的變量n,在每導(dǎo)出一條數(shù)據(jù)時加1后導(dǎo)出為序號列即可。
最后,我們來看一個真正實戰(zhàn)的例子:
當(dāng)今企業(yè)給員工發(fā)工資一般都通過銀行代發(fā)的方式。銀行都提供了網(wǎng)上服務(wù),企業(yè)可以通過這個途徑來完成自助工資發(fā)放,具體的做法是:
銀行提供了一個代發(fā)工資的文本文件格式,企業(yè)用戶只要按格式編寫此文件,再通過網(wǎng)上銀行上載此文件,就可以完成工資發(fā)放。
下面我們就來看看如何利用集算器方便地完成代發(fā)工資文本文件的生成。
我們以民生銀行為例,其文件格式如下:
ATNU:0019999
MICN:
CUNM:北京 XXXX 技術(shù)有限公司
MIAC:0110014180030254
EYMD:1
TOAM:80576.39
COUT:5
---------------------------------------
6226220101871111|19944.65|趙愛潤 ||
6226220101872222|18349.08|孫學(xué)乾 ||
6226220101873333|15955.72|王老集 ||
6226220101874444|14360.15|張小算 ||
6226220101875555|11966.79|李大器 ||
此文件前 8 行是文件頭,第 1、2、5、8 行內(nèi)容固定不變,第 3 行是企業(yè)名稱,第 4 行是企業(yè)在民生銀行的賬號,第 6 行是本次發(fā)工資的總金額,第 7 行是發(fā)工資的總筆數(shù)。從第 9 行開始是具體的工資信息,第一項是員工工資賬號,第二項是工資金額,第三項是員工姓名,第四、五項空著不填就行。各項之間用豎線分隔。
此文本文件的格式要求非常嚴(yán)格,不能出錯,因此不適合財務(wù)人員直接編輯,需要通過程序生成。
企業(yè)與工資相關(guān)的有兩個 excel 表,一個是員工表,另一個是工資表,如下兩圖所示。
賬務(wù)人員負(fù)責(zé)填好員工工資表后,就可以打開集算器 ide,運行預(yù)先編寫好的 dfx 程序了:
A | B | |
1 | =file("員工表.xlsx").xlsimport@t() | =file("工資表.xlsx").xlsimport@t() |
2 | =A1.join(姓名,B1: 姓名, 銀行實發(fā), 備注 ) | |
3 | =file("發(fā)工資.txt") | |
4 | =A3.write("ATNU:0019999") | =A3.write@a("MICN:") |
5 | =A3.write@a("CUNM:北京 XXXX 技術(shù)有限公司 ") | =A3.write@a("MIAC:0110014180030254") |
6 | =A3.write@a("EYMD:1") | =A3.write@a("TOAM:"+string(A2.sum(銀行實發(fā) ),"#.00")) |
7 | =A3.write@a("COUT:"+string(A2.count())) | =A3.write@a("---------------------------------------") |
8 | =A3.export@a(A2,工資卡號,string(銀行實發(fā),"#.00"), 姓名, 備注, 備注;"|") |
A1中讀入編寫的員工表
B1中讀入編寫的工資表
A2中按姓名將兩張表合并成一張表
A3打開要保存的代發(fā)工資文件
從 A4 到 B7 中逐行寫入文件頭:其中:B6 是工資總額,從 A2 中算出銀行實發(fā)總額填入;A7 是本次代發(fā)的總筆數(shù)。
在 A8 中導(dǎo)出生成代發(fā)工資文件,分別是工資卡號、工資金額、姓名、空列、空列 (最后兩列是不需要填的,所以用備注列代表)。
腳本中除了 A4 格是用替換寫入以外,其它格都用了 @a 選項,表示是追加寫入。
至于其它銀行,過程大致與此類似。只要根據(jù)銀行對文本文件格式的說明,編寫好集算器 dfx 程序就可以了。
簡單總結(jié)一下,在數(shù)據(jù)導(dǎo)出過程中,集算器提供了 write()和 export() 兩個函數(shù),前者是逐行寫入,后者是批量寫入。函數(shù)提供了參數(shù)和函數(shù)選項兩種控制方法,使用不同的參數(shù)或函數(shù)選項,我們可以指定是否導(dǎo)出字段名 / 標(biāo)題、是否導(dǎo)出所有字段、是否使用新的字段名、追加還是替換文件、使用哪個字符做分隔參數(shù)等等選擇。
在見證了數(shù)據(jù)導(dǎo)出過程中集算器強大而靈活的能力后,是不是也有了莫名的沖動呢?趕快下載集算器,加入共同探索、一起變強的行列吧!
分享標(biāo)題:文本導(dǎo)出的方方面面—工資好助手
本文網(wǎng)址:http://m.rwnh.cn/article46/jcjphg.html
成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供做網(wǎng)站、App設(shè)計、網(wǎng)站設(shè)計、商城網(wǎng)站、小程序開發(fā)、靜態(tài)網(wǎng)站
聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會在第一時間刪除。文章觀點不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時需注明來源: 創(chuàng)新互聯(lián)