You’ll just have to assemble the data into a single text layer.
row1 = footage("your.csv").dataValue([0,0]);
row2 = footage("your.csv").dataValue([0,1]);
row3 = footage("your.csv").dataValue([0,2]);
row4 = footage("your.csv").dataValue([0,3]);
row5 = footage("your.csv").dataValue([0,4]);
row1 + "\r" + row2 + "\r" + row3 + "\r" + row4 + "\r" + row5 //"\r" adds a return
If you want a slider to control the offset you can just use it’s data in dataValue.
rowoffset = effect("Slider Control")("Slider");
row1 = footage("your.csv").dataValue([1,0 + rowoffset]);
row2 = footage("your.csv").dataValue([1,1 + rowoffset]);
row3 = footage("your.csv").dataValue([1,2 + rowoffset]);
row1 + "\r" + row2 + "\r" + row3
Row offset is easier than controlling the number of rows. That would be a harder task since you would need to anticipate all the different values. Is it going to be 1 row or 100? No mater what you would need to code all those variables.
numrows = effect("Slider Control")("Slider");
rowoffset = effect("Slider Control")("Slider");
row1 = footage("your.csv").dataValue([1,0 + rowoffset]);
row2 = footage("your.csv").dataValue([1,1 + rowoffset]);
row3 = footage("your.csv").dataValue([1,2 + rowoffset]);
R1 = row1;
R2 = row1 + "\r" + row2;
R3 = row1 + "\r" + row2 + "\r" + row3;
if (numrows == 1) {R1}
else if (numrows == 2) {R2}
else {R3}