在數據處理業務中,經常要把文件結構相同或近似相同的數據文件合并成一個文件,或者將一個比較大的數據文件拆分成小的數據文件。本文將介紹文本文件和 Excel 文件合并及拆分會遇到的幾種情況,并提供用 esProc SPL 編寫的代碼示例。esProc 是專業的數據計算引擎,SPL 中有完善的文件導入、導出及目錄操作函數,非常適合做數據文件的合并及拆分工作。
一、 文件合并
1. 同構文本文件合并
在某個文件目錄下有多個文本文件,這些文件表頭和列結構完全相同,只是數據行數和數據內容不同,需要將這些文件的數據全部合并到一個文本文件中,共用同一個表頭。
示例:在e:/orders目錄下有每日的訂單文本文件,每個文件的結構相同,第一行是列名,第二行開始是數據,如下圖所示,請將它們合并成一個訂單表文件orders.txt。

esProc SPL腳本如下:
A | 注釋 |
如果e:/orders還有子目錄,子目錄中的txt文件也需要一起合并,那么把A1格改成=directory@ps("e:/orders/*.txt"),選項@s表示遞歸查找所有子目錄下的文件。
上面這段腳本是假設內存能夠裝下合并以后的全部數據,如果裝不下,那么應該用下面這段腳本:
A | B | C |
A1 列出目錄中的所有txt文件的完整路徑名稱,如果要查找子目錄,則加上@s選項
A2 對列出的文件進行循環
B2 用游標讀取每一個文件,@t表示第一行是列名
B3-C4 將B2游標中數據導出,第一次要導出列名,其后用@a進行追加
2. 結構近似的文本文件合并
如果文件結構并不是完全相同,比如列的順序不一樣、列數不一樣,但各文件都含有共同的幾列,想要把這些共同列的數據都合并到一個文件中。合并這些文件時,需要按指定順序讀出每個文件中的這些共同列數據。
示例:還是上面這個例子,已知所有訂單文件都有ID、Company、Area、OrderDate、Amount這5列,但各文件中列的順序并不相同,有的文件還有其它一些列,請將各文件中的這5列數據合并到orders.txt文件中。
esProc SPL腳本如下:
A | 注釋 |
同樣地,如果內存裝不下合并后的所有數據,則使用下面這段腳本:
A | B | C |
3. 文件名轉成列數據
在合并數據的同時,需要為合并后的數據增加一列,并用合并前的文件名給此列賦值,以便標記數據類別或來源。
示例:在e:/orders目錄下有各種零件的訂單Excel文件,文件名就是零件的名字,比如tyre.xlsx、engine.xlsx……等,每個文件的結構相同,第一行是列名,第二行開始是數據,如下圖所示,請將它們合并成一個訂單表文件orders.xlsx,并增加一列PartName用來記錄零件的名字。
esProc SPL腳本如下:
A | 注釋 |
同樣地,如果內存裝不下合并后的所有數據,則使用下面這段腳本:
A | B | C |
合并后的orders.xlsx文件部分數據如下圖所示:

二、 文件拆分
1. 分組拆分
對文件中數據進行分組,把每組數據單獨存為一個文件,用組名為文件命名。
示例:在訂單表Excel文件中有各種零件的訂單,請把同種零件的訂單各存為一個Excel文件,以便發送給零件生產部門。
esProc SPL腳本如下:
A | B |
A1 讀入所有原始數據
B1 按partName分組
A2 循環每個零件組的訂單信息
B2 以零件名稱作為文件名,導出零件信息
如果原文件很大,不能全部裝入內存,那么應該使用游標方式讀數,腳本如下:
A | B | C | D |
A1 創建游標讀取原始數據
A2 循環游標讀數,每次讀50000行(讀多少行根據內存大小決定)
B2 對每次讀取的數據按partName分組
B3 循環每組零件
C3 以零件名稱作為文件名創建文件對象
C4-D5 如果文件已存在,則用@a追加寫入零件訂單信息,不存在則用@t先寫入列名再導入數據
2. 記錄占據多行的拆分
在文本文件中,一條數據記錄是由多行數據組成的,在拆分成小文件時,要識別哪幾行是同一條數據記錄,保證同一條數據記錄不會被拆分到兩個文件中。
示例1:有網站運行日志文件log.txt,每條日志由5行組成,現在需要把這個日志文件拆分成一些小文件,每個文件由1000條日志組成。
esProc SPL腳本如下:
A | B |
A1 用游標讀取日志文件數據,@s表示將整行讀成一個字符串
A2 循環游標,每次取5000行,剛好是1000條日志
B2 按循環序號生成日志文件名,如log_1.txt、log_2.txt……,然后將當前取出的所有行寫入
示例2:有程序運行日志文件log.txt如下圖所示,每條日志由不確定的幾行組成,每條日志由中括號開頭,其后只要不是中括號開頭的行,都與它屬于同一條日志。現在需要把這個日志文件拆分成一些小文件,每個文件由1000條日志組成。

esProc SPL腳本如下:
A | B |
A1 打開日志文件讀取數據,@n表示將每一行讀成一個字符串,所有串組成一個序列返回
B1 篩選出非空的行
A2 按行是否用中括號開頭作為分組條件,中括號開頭的作為一個新組,不是則并到當前組。最后把所有組序列轉換成游標
A3 循環游標,每次取1000個組,即1000條日志
B3 按循環序號生成日志文件名,如log_1.txt、log_2.txt……
B4 兩層循環,外層是循環1000個組,內層循環每組的成員(即數據行),將每行追加寫入文件