HollDump
From Pickwiki
Jump to navigationJump to search* HOLLDUMP - does a hollerith dump of a data file ************************************************************************ PROGRAM HOLLDUMP * takes the file name and a list of field names, dumping them into the * &HOLD& file as a fixed-width dump. The width is recovered from the dict. * Multi-values are handled by leaving blanks (not needed for re-import) * for single-value items. Sub-values are not handled. ************************************************************************ ARGS = CONVERT( " ", @FM, TRIM( UPCASE( @SENTENCE))) LOCATE "HOLLDUMP" 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 DICTENTRIES(II-1)<5> = CONVERT( \'"\ , "", 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 dumping must be D-type" IF DICTENTRIES(II)<2> GT MAXFIELD THEN MAXFIELD = DICTENTRIES(II)<2> NEXT IF DICTENTRIES(1)<2> NE 0 THEN STOP "First field to dump must be @ID or equivalent" SELECT FILEPTR READLIST KEYLIST THEN CONVERT @IM TO @FM IN KEYLIST IF KEYLIST EQ "" THEN STOP "Unable to find any records on ":FILENAME DELETE HOLD, HOLDFILENAME WRITE "" TO HOLD, HOLDFILENAME WRITE "" TO HOLD, HOLDFILENAME:".ERROR" OPENSEQ "&HOLD&", HOLDFILENAME TO SEQPTR ELSE STOP "Unable to open ":HOLDFILENAME:" in &HOLD&" OPENSEQ "&HOLD&", HOLDFILENAME:".ERROR" TO SEQERRPTR ELSE STOP "Unable to open ":HOLDFILENAME:".ERROR in &HOLD&" DIM DATAREC( MAXFIELD) LOOP REMOVE KEY FROM KEYLIST SETTING MER MATREAD DATAREC FROM FILEPTR, KEY THEN ERRORS = 0 * count max no of values... VALUECOUNT = 1 FOR II = 1 TO FIELDCOUNT IF DICTENTRIES(II)<6> EQ "M" THEN VALUES = DCOUNT( DATAREC(DICTENTRIES(II)<2>), @VM) IF VALUES GT VALUECOUNT THEN VALUECOUNT = VALUES END NEXT * now loop processing FOR II = 1 TO VALUECOUNT LINE = FMT( KEY, DICTENTRIES(1)<5>) FOR JJ = 2 TO FIELDCOUNT LINE := FMT( DATAREC(DICTENTRIES(JJ)<2>)<1,II>, DICTENTRIES(JJ)<5>) NEXT IF COUNT( LINE, @TM) THEN IF ERRORS ELSE PRINT "Format Error processing ":KEY; ERRORS += 1 WRITESEQ LINE TO SEQERRPTR ELSE PRINT "Sequential-write error processing ":KEY END ELSE WRITESEQ LINE TO SEQPTR ELSE PRINT "Sequential-write error processing ":KEY END NEXT END ELSE PRINT "Error reading ":KEY:" from file" WHILE MER REPEAT RETURN ******************************** SYNTAX: PRINT "Syntax is:" PRINT "RUN GBP HOLLDUMP filename holdfilename id-field [FMT code] [fieldname [FMT code] [fieldname...]]" RETURN END