HollLoad
From Pickwiki
* HOLLLOAD - Does a hollerith load of a data file ************************************************************************ PROGRAM HOLLLOAD * takes the file name and a list of field names, retrieving them into the * &HOLD& file as a fixed-width dump. The width is recovered from the dict. * Sub-values are not handled. * !!! WARNING - This routine will destroy any existing data in records it * overwrites. ************************************************************************ ARGS = CONVERT( " ", @FM, TRIM( UPCASE( @SENTENCE))) LOCATE "HOLLLOAD" IN ARGS<1> SETTING NAMEPOSN ELSE GOTO SYNTAX: FILENAME = ARGS<NAMEPOSN+1> IF FILENAME EQ "" THEN GOTO SYNTAX: HOLDFILENAME = ARGS<NAMEPOSN+2> FIELDCOUNT = DCOUNT( ARGS, @FM) - (NAMEPOSN+2) DIM DICTENTRIES( FIELDCOUNT) OPEN "", FILENAME TO FILEPTR ELSE STOP "Unable to open ":FILENAME OPEN "DICT", FILENAME TO DICTPTR ELSE STOP "Unable to open DICT ":FILENAME OPEN "", "&HOLD&" TO HOLD ELSE STOP "Unable to open the &HOLD& file" MAXFIELD = 0 FOR II = 1 TO FIELDCOUNT IF ARGS<NAMEPOSN+2+II> EQ "FMT" THEN * need to strip LRT here because it's last entry not current entry ... DICTENTRIES(II-1)<5> = CONVERT( \'"LRT\ , "", ARGS<NAMEPOSN+3+II>) DEL ARGS<NAMEPOSN+2+II>; DEL ARGS<NAMEPOSN+2+II> FIELDCOUNT -= 2 IF II GT FIELDCOUNT THEN EXIT END READ DICTENTRIES(II) FROM DICTPTR, ARGS<NAMEPOSN+2+II> ELSE STOP "Unable to read ":ARGS(NAMEPOSN+2+II):" from dictionary" IF DICTENTRIES(II)[1,1] NE "D" THEN STOP "Fields for loading must be D-type" IF DICTENTRIES(II)<2> GT MAXFIELD THEN MAXFIELD = DICTENTRIES(II)<2> DICTENTRIES(II)<5> = CONVERT( "LRT", "", DICTENTRIES(II)<5>) IF NUM( DICTENTRIES(II)<5> ) ELSE STOP "Dict entry for ":ARGS<NAMEPOSN+2+II>:" format is illegible" NEXT IF DICTENTRIES(1)<2> NE 0 THEN STOP "First field to load must be @ID or equivalent" OPENSEQ "&HOLD&", HOLDFILENAME TO SEQPTR ELSE STOP "Unable to open ":HOLDFILENAME:" in &HOLD&" DIM DATAREC( MAXFIELD) OLDKEY = "" LOOP READSEQ LINE FROM SEQPTR ELSE LINE = "" LINEPOS = 1 FIELDLEN = DICTENTRIES(1)<5> ;* note this has had L[[/R/T]] stripped ... KEY = TRIM( LINE[1, DICTENTRIES(1)<5>]) LINEPOS += FIELDLEN IF KEY NE OLDKEY THEN IF OLDKEY NE "" THEN MATWRITE DATAREC TO FILEPTR, OLDKEY RELEASE END OLDKEY = KEY MAT DATAREC = "" VALUENO = 1 END ELSE VALUENO += 1 WHILE LINE FOR II = 2 TO FIELDCOUNT FIELDLEN = DICTENTRIES(II)<5> IF VALUENO EQ 1 OR DICTENTRIES(II)<6> EQ "M" THEN VALUE = TRIM( LINE[LINEPOS, FIELDLEN]) LINEPOS += FIELDLEN IF VALUE NE "" THEN DATAREC(DICTENTRIES(II)<2>)<1,VALUENO> = VALUE END NEXT REPEAT RETURN ******************************** SYNTAX: PRINT "Syntax is:" PRINT "RUN GBP HOLLLOAD filename holdfilename id-field [fieldname [fieldname...]]" RETURN END