行式文本文件合并
1. 同构合并
在某个文件目录下有多个文本文件,这些文件表头和列结构完全相同,只是数据行数和数据内容不同,需要将这些文件的数据全部合并到一个文本文件中,共用同一个表头。
示例:在e:/orders目录下有每日的订单文本文件,每个文件的结构相同,第一行是列名,第二行开始是数据,如下图所示,请将它们合并成一个订单表文件orders.txt。
esProc SPL脚本如下:
A |
|
1 |
=directory@p("e:/orders/*.txt") |
2 |
=A1.conj(T(~)) |
3 |
=T("e:/orders.txt",A2) |
A1 列出e:/orders目录中所有txt文件名,选项@p表示列出文件的全路径名
A2 读出A1中所有文件的数据并合并起来,T函数会自动根据文件扩展名选用适合的分隔符
A3 将A2中合并后的数据写入文件orders.txt,T函数会自动根据文件扩展名选用适合的分隔符
2. 结构近似的合并
如果文件结构并不是完全相同,比如列的顺序不一样、列数不一样,但各文件都含有共同的几列,想要把这些共同列的数据都合并到一个文件中。合并这些文件时,需要按指定顺序读出每个文件中的这些共同列数据。
示例:还是上面这个例子,已知所有订单文件都有ID、Company、Area、OrderDate、Amount这5列,但各文件中列的顺序并不相同,有的文件还有其它一些列,请将各文件中的这5列数据合并到orders.txt文件中。
esProc SPL脚本如下:
A |
|
1 |
=directory@p("e:/orders/*.txt") |
2 |
=A1.conj(T(~;ID,Company,Area,OrderDate,Amount)) |
3 |
=T("e:/orders.txt",A2) |
A1 列出e:/orders目录中所有txt文件名,选项@p表示列出文件的全路径名
A2 读出A1中所有文件中的ID,Company,Area,OrderDate,Amount等5列数据并合并起来,T函数会自动根据文件扩展名选用适合的分隔符
A3 将A2中合并后的数据写入文件orders.txt,T函数会自动根据文件扩展名选用适合的分隔符
3. 文件名转成列数据
在合并数据的同时,需要为合并后的数据增加一列,并用合并前的文件名给此列赋值,以便标记数据类别或来源。
示例:在e:/orders目录下有各种零件的订单文本文件,文件名就是零件的名字,比如tyre.csv、engine.csv……等,每个文件的结构相同,第一行是列名,第二行开始是数据,如下图所示,请将它们合并成一个订单表文件orders.csv,并增加一列PartName用来记录零件的名字。
esProc SPL脚本如下:
A |
|
1 |
=directory@p("e:/orders/*.csv") |
2 |
=A1.conj((fn=filename@n(~),T(~).derive(fn:PartName))) |
3 |
=T("e:/orders.csv",A2) |
A1 列出e:/orders目录中所有csv文件名,选项@p表示列出文件的全路径名
A2 循环A1中所有文件,用filename函数得到当前文件的名字赋给变量fn,选项@n表示取得不带扩展名的文件名。用T函数读出当前文件的数据后增加一列PartName,列值为fn,并将所有文件数据合并起来。T函数会自动根据文件扩展名选用适合的分隔符
A3 将A2中合并后的数据写入文件orders.csv,T函数会自动根据文件扩展名选用适合的分隔符