Here is some code that you could use in a user defined emulation that would split the data page every time the number at the start (the number before you hit the first

.
if((&Idx <> mid(&str,1,pos(';',&str))) and (&Idx <> ''))
doform()
clearpage()
endif
set(¤t.line,¤t.line + 1)
store(¤t.line,&str)
if(ge(¤t.line,¤t.lpp))
doform()
clearpage()
endif()
&Idx := mid(&str,1,pos(';',&str))You will need to create a global string variable called idx for this to work.
What we are basically doing is testing the value of idx against the numbers at the start of the line. If they are different we create a new data page. If they are the same, we just store the line.
As for having 3 pages, if the objects are not of variable height then you can just map each one. For example, the data mappings on the first page would be from lines 1-50, the mappings on page 2 from 51-100 and 101-150 on page 3.
You could then create conditions to test if the lines are empty to make sure you don't print out blank pages when your data does not require more then 1 document page.
You could do an advanced condition that would look something like this
=length(trim(@(51,1,100))) <> 0
So if line 51 contains no data, we don't print it.