Page 1 of 1

Count numbers of lines under each header

Posted: Fri May 20, 2016 10:30 pm
by Puneeth R
Hi,
I have a requirement as follows,
I get an input file which has header followed by many lines (detail records).N I need to find the number of lines under each header and write it to the header. What approach should I take? I mean which is the best way to achieve this? COBOL or any sort techinques? Please give me some start about the approach to be taken.
Following is the sample input file that I get,

Code: Select all

HD1234abcdefg
Ln1
Ln2
Ln3
HD1457789
Ln1
Ln2
I need to count the number of lines under each header and write it to its header record.

Re: Count numbers of lines under each header

Posted: Fri May 20, 2016 11:41 pm
by Robert Sample
You left out some information -- how many lines per header maximum? record length? fixed or variable length records?
The COBOL approach would be to read each record into a table until the next header is read.  The number of table entries (minus 1 for the header) would give you the count to put into the header.  Then write all the records from the table to your output data set, initialize your table, move the header to the first table entry, and start filling the table again.

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 8:51 am
by Puneethr
Hi Robert,
Thanks a lot for your response. And the file is fixed block with record length 2024. Maximum headers and lines are not known...according to me there might be 1000 headers in a file and 100lines under each header at the max.
I have never used tables or arrays till now. I will try and follow the method suggested by you and will post here if I get into trouble. Any more suggestions regarding the table declarations? As to how much should I declare? It should be a two dimensional array rite? Sorry for asking silly doubts. But I have never worked with arrays.
Thanks in advance.

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 10:07 am
by Robert Sample
Be generous in your table declarations -- if you guess small, you'll have to rerun the compile and link (bind) before rerunning the program; guessing too big merely means your program has unused memory.  And depending upon the version of COBOL you have anywhere from 128 MB (version 3.4) to 1 GB (version 6.1 - technically, 999,999,999 bytes is not quite 1 GB) of memory available, so define your table something like

Code: Select all

01  HOLD-TABLE.
    05  HT-ENTRY            OCCURS 5000
                            INDEXED BY HT-INDEX
                                       HT-WRITE-INDEX
                            PIC X(2024).
Read the first record and move it to the first table entry, setting HT-INDEX to 1.  After that, start your read loop.  In the read loop, if the record is NOT a header, add 1 to HT-INDEX (SET HT-INDEX UP BY 1) and move the input data to HT-ENTRY (HT-INDEX), then read the next record.  If the record IS a header, write the table out (see below), set HT-INDEX to 1, and move the record to HT-ENTRY (HT-INDEX).  When you hit end-of-file, you'll need to write out the table because the last group of records in the file is still in the table.  I did not include the code to validate that you don't run out of table entries, but you'll want to check for that since you don't know how many records can occur for a header.
Your code to write the table will be something like

Code: Select all

PERFORM
    VARYING HT-WRITE-INDEX FROM 1 BY 1
      UNTIL HT-WRITE-INDEX > HT-INDEX
    WRITE OUT-FILE-RECORD FROM HT-ENTRY (HT-WRITE-INDEX)
END-PERFORM
If you use index as I show, you'll need to use SET instead of ADD / MOVE (which are used for subscripts).
I would count the input records, the input headers, the maximum number of records for a header, the output records and print these numbers out at the end of the program to get a better idea of what the data set has.

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 11:14 am
by enrico-sorichetti
I would read the input file using two ddnames
the first ddname ( readonly ) to find the counts the second to write the updates

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 1:08 pm
by William Collins
enrico's idea is a flyer for this, but bear in mind that it is not a panacea for all "we should have thought of that when we designed the file" situations.

So, why is the count needed? Why can't it be put on when the file is created?

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 3:47 pm
by Puneethr
Hi Robert,
Thanks again.But this will only write the input records to output right? but I want to put the line count to header. As you said the (number of table entries - 1) would give the line count, but how to update the header before writing? Please let me know your thoughts.

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 3:50 pm
by Puneethr
Hi Enrico,
Thanks for your reply.Your idea too is great but the only drawback is it will cause more load, as now i will have to read the file twice.This can be kept as a backup option if the table approach doesnt work. Thank you for your suggestion,.

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 3:54 pm
by Puneethr
William Collins wrote:enrico's idea is a flyer for this, but bear in mind that it is not a panacea for all "we should have thought of that when we designed the file" situations.

So, why is the count needed? Why can't it be put on when the file is created?
Hi William,
The file is an existing one and the structure cannot be altered is what i found out.So trying to calculate the line count under each header by writing a new program.
Puneeth

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 6:56 pm
by Robert Sample
The file is an existing one and the structure cannot be altered is what i found out.
I hope you mean that the existing processing cannot be altered.  If you cannot change the header record to add your count, then this
I need to count the number of lines under each header and write it to its header record.
from your original post is a contradiction.  Terminology is critical in IT since similar terms may mean very different things, and you need to be able to precisely state what is needed to be able to code a program correctly.

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 6:59 pm
by enrico-sorichetti
Your idea too is great but the only drawback is it will cause more load,
computer time costs less that programmer' s time

to test it just write a 10 liner program

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 7:34 pm
by Anuj Dhawan
I have been on a non-mainframe side of activities for some time now and that keeps me on the boat with no mainframe access until I get a working Hercules. Tried a guess work for a SORT solution, see if this works: (it places the count for detail records on position 15 in header)

Code: Select all

//STEP01 EXEC PGM=SORT
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=...  input file (FB/2024)
//SYMBL DD DSN=&&SYMBL1,UNIT=SYSDA,SPACE=(TRK,(1,2)),DISP=(,PASS)
//TEMP1 DD DSN=&&TEMP1,UNIT=SYSDA,SPACE=(CYL,(5,10)),DISP=(,PASS)
//SYSIN DD *
  OPTION COPY
  OUTFIL FNAMES=SYMBL,REMOVECC,NODETAIL,
    BUILD=(1,80),
    TRAILER1=('DTLCNT,''',COUNT-1=(EDIT=(TTTTTT)),'''')
  OUTFIL FNAMES=TEMP1,
    OVERLAY=(2025:SEQNUM,8,ZD)
/*
//STEP02 EXEC PGM=SORT
//SYMNAMES DD DSN=&&SYMBL1,DISP=(OLD,PASS)
//SYSOUT DD SYSOUT=*
//SORTIN DD DSN=&&TEMP1,DISP=(OLD,PASS)
//SORTOUT DD DSN=...  output file (FB/2024)
//SYSIN DD *
  OPTION COPY
  INREC IFOUTLEN=2024,
    IFTHEN=(WHEN=(2025,8,ZD,EQ,1),OVERLAY=(15:DTLCNT))
/*
I'm doubtful about the multiple headers though - William might put me in order, I'd believe.

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 9:21 pm
by Puneethr
Hello Robert, Anuj, William and Enrico,

Thanks a lot to each one of you. With all your inputs I was able to write a Cobol program for the requirement.
Highly appreciate the way you guys are helping beginners like me.
@Anuj: I am amazed to know that this can be achieved using sort also.Will give that a try as well.
@William: Sure, I will keep in mind that I have to use the correct terminology while mentioning my requirement. Will follow this from next time.

Thanks again guys!

Re: Count numbers of lines under each header

Posted: Sat May 21, 2016 10:02 pm
by Anuj Dhawan
COBOL or SORT - Keep us posted about the progress you make at your end on this! :)