This program reads the ascii annual COMPUSTAT file /usr/compustat/pst_annual_current.dat

      program annual
      integer dnum,cic,rec,file,zlist,fyr(20),yeara(20),xrel,stk,dup,
     * ucode(20),state,county,finc,source(20)
      character*6 cnum,lcnum
      character*28 coname,iname,dumnam
      character*8 smbl
      character*2 aftnt(70,20),csspin,sdbt,sdbtim,subdbt
      character*1 cpspin,csspii
      character*3 cpaper
      character*10 ein
      real*4 data(350,20)
      integer irec,ioff,i,j,fileid,cutoff,ncomps,prev,ncount,create
      open(unit=10,
     * file='/usr/compustat/pst_annual_current.dat',
     * status='old',form='formatted')

c read header
      read(10,989) fileid,cutoff,create,ncomps,prev
  989 format(442x,i2,i6,i6,4x,i5,i6,7861x)
      write(*,*) ncomps,fileid,cutoff,create,prev

c read records 1 through 4
  30  do 10 irec=1,4
c since each record has 5 years, ioff is the year offset
      ioff=(irec-1)*5+1
      read(10,990,end=900) dnum,cnum,cic,rec,file,zlist,dumnam,smbl,
     * (fyr(i),i=ioff,ioff+4),(yeara(i),i=ioff,ioff+4),xrel,
     * stk,dup,(ucode(i),i=ioff,ioff+1),
     * ((aftnt(i,j),i=1,35),j=ioff,ioff+4),
     * ((data(i,j),i=1,175),j=ioff,ioff+4)

c  lcnum is to make sure that you are reading the correct records
      if(cnum.eq.'000000')goto 900
      if(irec.eq.1) then
        coname=dumnam
        lcnum=cnum
      endif
      if(irec.eq.2)iname=dumnam
      if(lcnum.ne.cnum.or.rec.ne.irec)then
        write(*,*)'warning--misaligned records',
    *   rec,irec,lcnum,cnum
        goto 900
      endif
  990 format(i4,a6,i3,i1,i2,i2,a28,a8,10i2,i4,i1,i2,6x,5i1,175a2,
     * 5(13f10.3,f8.3,f10.3,f8.3,5f10.3,3f8.3,f10.3,f8.3,f10.6,
     * f10.3,f8.3,3f10.3,f8.3,f10.3,f8.3,2f10.3,2f8.3,6f10.3,
     * f8.3,3f10.3,3f8.3,f10.4,6f8.3,3f10.3,3f8.3,f10.3,f8.3,
     * 3f10.3,f8.3,f10.3,2f8.3,f10.3,6f8.3,3f10.3,2f8.3,f10.3,
     * 4f8.3,f10.3,4f8.3,4f10.3,8f8.3,2f10.3,f8.3,7f10.3,f8.3,
     * 6f10.3,5f8.3,3f10.3,f8.3,5f10.3,f8.3,4f10.3,2f8.3,f10.3,
     * 3f8.3,f10.3,11f8.3,f10.3,6f8.3,f10.3,f8.3,f10.3,2f8.3,
     * f10.3))
c note that the data array for 1-4 and 5-8 are same format.
c for aftnt and data the items cycle fastest, then years, first data is oldest
c record 1,3 coname=dumnam (just set on record 1)
c record 2,4 iname=dumnam (just set on record 2)
  10  continue

c read records 5 through 8
      do 20 irec=5,8
      ioff=(irec-5)*5+1
      do 20 irec=5,8
        ioff=(irec-5)*5+1
        read(10,991) dnum,cnum,cic,rec,file,state,county,finc,
     * (source(i),i=ioff,ioff+4),
     * cpspin,csspin,csspii,sdbt,sdbtim,subdbt,cpaper,ein,
     * ((aftnt(i,j),i=36,70),j=ioff,ioff+4),
     * ((data(i,j),i=176,350),j=ioff,ioff+4)
  991 format(i4,a6,i3,i1,i2,i2,i3,i2,5i2,a1,a2,a1,a2,a2,a2,a3,
     * 6x,a10,30x,175a2,
     * 5(13f10.3,f8.3,f10.3,f8.3,5f10.3,3f8.3,f10.3,f8.3,f10.6,
     * f10.3,f8.3,3f10.3,f8.3,f10.3,f8.3,2f10.3,2f8.3,6f10.3,
     * f8.3,3f10.3,3f8.3,f10.4,6f8.3,3f10.3,3f8.3,f10.3,f8.3,
     * 3f10.3,f8.3,f10.3,2f8.3,f10.3,6f8.3,3f10.3,2f8.3,f10.3,
     * 4f8.3,f10.3,4f8.3,4f10.3,8f8.3,2f10.3,f8.3,7f10.3,f8.3,
     * 6f10.3,5f8.3,3f10.3,f8.3,5f10.3,f8.3,4f10.3,2f8.3,f10.3,
     * 3f8.3,f10.3,11f8.3,f10.3,6f8.3,f10.3,f8.3,f10.3,2f8.3,
     * f10.3))
      if(lcnum.ne.cnum.or.rec.ne.irec)then
        write(*,*)'warning misaligned records ',
     *  rec,irec,lcnum,cnum
        goto 900
      endif
  20  continue
c ****************************************
c  insert your processing code here
c
c ****************************************

      goto 30
  900 stop
      end