We recently needed to split a large file into six pieces for downloading & transmission. After a bit of experimentation, I came up with this program that can split any file into any number of segments. Call FILESPLIT with the name of the file (10c), its library (10c), and the number of splits (2c).
The splits will be named with the first eight characters of the file, followed by a two digit number (00-99). The result files are placed in the same library as the original.
If the last split file is small (less that 1/2 the size of the others), its records are added to the last split instead.
** Since the program works by copying from record-number to record-number, the original file is reorganized to remove deleted records.
/* Split the library/file into #splits files, named */
/* filenameXX, where xx will be from 01 to 99. The result*/
/* files will be in the same library as the original file*/
/* The original file is reorganized to compress out */
/* deleted records. */
/* Split files have same text, with ", part #xx" appended*/
/* filename must be 8 characters or less (due to suffix) */
/* Assumes *first member */
pgm parm(&filename &library
Requires Free Membership to View
Register today to access targeted resources from our editorial writers and independent industry experts including news, tips, and advice to help you do your job more efficiently and effectively. Stay informed on the hottest topics and biggest challenges faced by IT professionals working with iSeries products and services.
&c#splits)
dcl &filename *char 10
dcl &library *char 10
dcl &c#splits *char 2 /* desired # result files */
dcl splits *dec (10 0) /* desired # result files */
dcl &records *dec (10 0)
dcl &low *dec (10 0)
dcl &high *dec (10 0)
dcl &splitsize *dec (10 0)
dcl &i *dec (2 0)
dcl &c *char (2)
dcl &file *char (10)
dcl &desc *char (50)
chgvar splits (&c#splits)
/* split into multiple files */
rgzpfm &library/&filename
RTVMBRD FILE(&library/&filename) nbRCURRCD(&RECORDS) -
text(&desc)
chgvar &desc (%sst(&desc 1 40))
chgvar &splitsize (&records / splits)
chgvar &low (1)
chgvar &high (&splitsize)
chgvar &i (0)
loop: if (&low *lt &records) do
chgvar &i (&i + 1)
chgvar &c (&i)
chgvar &file (&filename *tcat &c)
dltf &library/&file
monmsg cpf2105
CPYF FROMFILE(&library/&filename) +
TOFILE(&library/&FILE) MBROPT(*ADD) +
CRTFILE(*YES) FROMRCD(&LOW) TORCD(&HIGH)
CHGOBJD OBJ(&library/&FILE) OBJTYPE(*FILE) TEXT( +
&desc *tcat ', part #' *tcat &c)
chgvar &low (&high + 1)
/* if last split is small, roll into previous & leave */
chgvar &high (&records - &low)
if ((&low < &records) & (&high < (&splitsize / 2))) do
CPYF FROMFILE(&library/&filename) +
TOFILE(&library/&FILE) MBROPT(*ADD) +
FROMRCD(&LOW) TORCD(&records)
chgvar &low (&records + 1)
enddo
chgvar &high (&low + &splitsize)
goto loop
enddo
ENDPGM
================================== MORE INFORMATION ON THIS TOPIC ==================================
The Best Web Links: tips, tutorials and more.
Ask your programming questions--or help out your peers by answering them--in our live discussion forums.
Ask the Experts yourself: Our application development gurus are waiting to answer your programming questions.
This was first published in July 2002