* C:\C_Ad_Hoc\spssx-l\Z-2005a . * \2005-03-25 Grigsby - Importing text file.SPS . * In response to posting . * Date: Fri, 25 Mar 2005 10:13:26 -0800 . * From: Sherlock Grigsby . * Subject: I need help importing text file . * To: SPSSX-L@LISTSERV.UGA.EDU . * "I need help importing the following text file into SPSS . * or Excel if anyone knows an easy way to do this." . NEW FILE. INPUT PROGRAM. * ---- Declaration section -------------------------------- . * Start: control variable for tracing . COMPUTE #TRC_LVL = 3. /* 0 = No tracing */ /* 1 = Basic path */ /* 2 = Details */ /* 3 = Finer details */ /* 4 = Local debugging traces */ FORMATS #TRC_LVL (F2). * Variables for the output file . NUMERIC CASE_NUM (F03) /* Order of case, in input */ /LINE_NUM (F04). /* Starting line # for case */ LEAVE CASE_NUM. *. /* Max */ STRING UCN (A20) /* UCN: tag 1 -- */ /PRIM_REF (A15) /* PRIM REF: tag 2 -- */ /L_NAME (A12) /* NAME: tag 3a 22 */ /F_NAME (A12). /* NAME: tag 3b, 22 */ NUMERIC SPN (N08) /* SPN: tag 4 -- */ /N_CTS (N02). /* NCTS: tag 5 -- */ STRING ARN (A09). /* ARN: tag 6 */ NUMERIC DOA (ADATE10)./* DOA: tag 7 */ STRING SEX (A01). /* SEX: tag 8 */ NUMERIC DOB (ADATE10)./* DOB: tag 9 */ STRING RACE (A01). /* RACE: tag 10 */ NUMERIC CT (N02). /* CT: tag 11 */ STRING DEG (A02). /* DEG: tag 12 */ NUMERIC DOO (ADATE10)./* DOO: tag 13 */ STRING REF (A15). /* REF: tag 14 */ NUMERIC OBTS (F10). /* OBTS: tag 15 */ STRING CHG (A37). /* CHG: tag 16 37 */ * Intermediate, housekeeping, and utility variables . * Initial buffer; contents of the current input line . * (It will be in the output; there's no good way to get rid . * of it. I'll probably blank it, as it's not meaningful.) . STRING CUR_LINE (A80). * Line buffers, counters, and pointers . NUMERIC #LINENUM (F3). /* No. of current line w/in input */ STRING #TAIL (A80). /* Trailing portion of input line; */ /* the part still to be searched */ NUMERIC #BREAK (F3). /* Starting point of string #TAIL */ /* in input line CUR_LINE */ * Tag names, lengths, and tag data buffers, as VECTORs . VECTOR #TAG (16,A09) /#TAGLN (16,F2) /#TAGTX (16,A40). DO IF #LINENUM = 0. * Initialize tag names; they're pseudo-constants . - DO REPEAT TAG=#TAG1 TO #TAG16 /TAG_NAME = 'UCN:' 'PRIM REF:' 'NAME:' 'SPN:' '#CTS:' 'ARN:' 'DOA:' 'SEX:' 'DOB:' 'RACE:' 'CT:' 'DEG:' 'DOO:' 'REF:' 'OBTS:' 'CHG:'. . COMPUTE TAG = TAG_NAME. - END REPEAT. * Save the lengths of the tags, also as pseudo-constants . - LOOP #TAG# =1 TO 16. . COMPUTE #TAGLN(#TAG#) = LENGTH(RTRIM(#TAG(#TAG#))). * The next line is a precaution, probably not needed . . COMPUTE #TAGTX(#TAG#) = ' '. - END LOOP. * One other start-of-run initialization: . . COMPUTE CASE_NUM = 0. END IF. * "Housekeeping" variables: . * Current stage of input and casse processing . NUMERIC #STAGE (F2). /* 0 Lines not part of a case */ /* 1 First case line found, */ /* parsing not yet started */ /* 2 Parsing (THE BIG ONE) */ /* 3 Parsing finished; read */ /* continuation line of'CHG:'*/ /* 4 Parsing finished; build */ /* and output final record. */ NUMERIC /* Tag found, whose text is being processed */ #CRTG# /* Which tag, by number */ #CRTG_BF /* Text position just before */ #CRTG_AF /* Text position just after */ (F3). NUMERIC /* Tag found, whose text will be processed next */ #NXTG# /* Which tag, by number (or 0) */ #NXTG_BF /* Text position just before */ #NXTG_AF /* Text position just after */ (F3). NUMERIC #PRTG# (F3). /* Latest processed tag, by numb*/ * Variables holding current data during parsing . NUMERIC #COLON (F3). /* Text position of a colon */ NUMERIC #CKTG# (F3). /* Tag number, to ck for match */ STRING #CKTAG (A9). /* Putative tag name, to compare*/ NUMERIC #NEWSTRT /* Start point of tag text */ #NEWLEN (F3). /* Length of tag text */ STRING #NEWTXT (A40). /* Tag text, extracted */ * String variables to build trace messages in . STRING #TRC_LN #TRC_PC (A80) /#TRC_TAG (A09) /#TRC_TXT (A40). * ---- Reading, parsing, and output section ------ . * Assumptions in this parser: . * - A case begins with a 'UCN:' tag at the beginning of a line. * (after dropping leading blanks). . * - Tags occur only in the order given in the vector above. . * However, tags may be skipped. . * - A case ends with a 'CHG:' tag and the subsequent value . * - No tag's value, except 'CHG:', is continued on a later . * line. (So, all data lines except the last begin with a . * tag, possibly following a string of blanks.) . * - The line following a 'CHG:' tag is *always* a . * continuation of the value -- possibly, blank. . * Parser logic notes: . * - Outer loop is through input lines; inner, through tags . * and text on a line . * - Outer loop is implicit: one input line on each pass . * through the "INPUT PROGRAM" text . * - Input lines must be handled differently depending on . * the current stage of parsing. Variable #STAGE gives that . * stage; see that different blocks of code are executed for . * different stages. Sorry; a bit kludgy. Alternative is . * DATA LIST commands at various places in the INPUT PROGRAM,. * and I decided that could be even more confusing. . * + Read, count, and trace, one input line . COMPUTE #LINENUM = #LINENUM + 1. * Trace: Line number of line being read . . /**/ DO IF #TRC_LVL GE 1. . /**/ PRINT / 'Line' #LINENUM (F4) ':'. . /**/ END IF. DATA LIST FIXED/ CUR_LINE(A80). * Trace: Contents of line read . * (Do not activate with in-stream data; in-stream . * data lines are always echoed. Not much use in . * general; an LTRIMmed version of the line is used.) . . /**/ DO IF #TRC_LVL GE 4. . /*-- PRINT / CUR_LINE. . /**/ END IF. * + Drop leading blanks from input line . COMPUTE CUR_LINE = LTRIM(CUR_LINE). * Trace: Line as LTRIMmed for processing . . /**/ DO IF #TRC_LVL GE 1. . /**/ PRINT / CUR_LINE. . /**/ END IF. * #STAGE 0: If not currently processing a case, see whether . * this line starts a new one ('UCN:') . DO IF #STAGE = 0 /* I.e., not currently parsing a case */ . . COMPUTE #CKTAG = SUBSTR(CUR_LINE,1,4). * Trace: First four characters of the input line . . /**/ DO IF #TRC_LVL GE 4. . /**/ PRINT / ' Begins: ' #CKTAG. . /**/ END IF. . IF (#CKTAG = 'UCN:') #STAGE = 1. /* NOW, ready to start parsing. END IF. * Trace: What is the current stage of parsing? . . /**/ STRING #STG_MSG (A40). . /**/ DO IF #TRC_LVL GE 1. . /**/ RECODE #STAGE /**/ (0 = 'Not in a case') /**/ (1 = 'Start a case' ) /**/ (2 = 'Parse input' ) /**/ (3 = 'Continue :CHG') /**/ (4 = 'All data read') /**/ INTO #STG_MSG. . /**/ PRINT / #STG_MSG. . /**/ END IF. * #STAGE 1: Initial settings, at the first line of a case . DO IF #STAGE = 1. . COMPUTE CASE_NUM = CASE_NUM + 1. /* Set case number */ . COMPUTE LINE_NUM = #LINENUM. /* Remember starting line */ * Trace: Beginning of a case - case number & starting line . . /**/ DO IF #TRC_LVL GE 1. . /**/ PRINT / ' ' 'Case' CASE_NUM ', starting on line ' LINE_NUM. . /**/ END IF. * --- Start with tag "UCN:" found: . * Current tag is "UCN:", in first 4 positions of the line . . COMPUTE #CRTG# = 1. /* 1 = "UCN:" */ . COMPUTE #CRTG_BF = 0. /* Start of line; no text before*/ . COMPUTE #CRTG_AF = 5. /* Text after, after 4 chars. */ . COMPUTE #PRTG# = 1. /* Latest processed tag, by numb*/ . COMPUTE #STAGE = 2. /* Initialized, ready to go */ . END IF. * #STAGE 2: Process a case line: separate into tags and text. . * The following is an INNER loop, processing all the . * tags on one line. The OUTER loop through the lines . * of a case is the implicit loop through the input. . LOOP #TGONLN = 1 TO 10 /* Allow for 10 tags on a line; */ IF (#STAGE = 2). /* process line only w/in a case */ * ++++ Find the next tag on the line being processed . * A tag must end with a colon; but I'm not counting on a . * colon delimiting a tag. Text preceding each colon, up . * through the colon, is compared with th4e names of all . * tags higher-numbered than the latest one recognized. . * This is the most complicated part of the code . * Difficulties include, . * - Splitting off the part of the input buffer not yet . * searched (variable #TAIL), AND recording accurately . * how much was split (variable #BREAK). . * - When a colon is found, checking the text up through . * the colon against the list of tag names. Since tag . * names have different lengths, that requires taking . * a different comparison substring for each tag. . * - When a tag name matches, calculating the locations . * of its beginning and ending IN THE ORIGINAL STRING. . * (For convenience, I'm calculating the locations of . * the last character before the tag, and the first . * character after.) . - DO IF #CRTG# = 0. /* If no tag is active, */ . COMPUTE #BREAK = 1. /* search from beginning of line;*/ - ELSE. /* if a tag is active, */ . COMPUTE #BREAK = /* start searching after the tag.*/ #CRTG_AF. - END IF. . COMPUTE #TAIL= /* Separate the substring to search*/ SUBSTR(CUR_LINE,#BREAK). . /**/ COMPUTE #TRC_PC = ' '. . /**/ DO IF #TRC_LVL GE 3. . /**/ PRINT / CUR_LINE. . /**/ COMPUTE SUBSTR(#TRC_PC,#BREAK,1) = '|'. . /**/ PRINT / #TRC_PC. . /**/ END IF. * Following is "second-order" trace; omit if extraction seems OK. . /**/ DO IF #TRC_LVL GE 4. . /**/ PRINT / #TAIL. . /**/ END IF. - LOOP #COLON# = 1 TO 20. /* Arbitrary: ck up to 20 colons */ . FORMATS #COLON#(F3). * ---- Find the next unchecked colon on the line . . COMPUTE #COLON = INDEX(#TAIL,':'). . /**/ DO IF #TRC_LVL GE 3. . /**/ DO IF #COLON > 0. . /**/ COMPUTE SUBSTR(#TRC_PC,(#COLON+#BREAK-1),1) = ':'. . /**/ PRINT / #TRC_PC. . /**/ END IF. . /**/ END IF. * ---- If a new colon was found, check text preceding it . * against all tags later than the latest one found . - LOOP #CKTG# = (#PRTG# +1) TO 16 IF (#COLON GT 0) . - DO IF #TAGLN(#CKTG# ) LE #COLON. . COMPUTE #CKTAG = SUBSTR(#TAIL,#COLON-#TAGLN(#CKTG#)+1 ,#TAGLN(#CKTG#)). * Trace: checking text on line against tag names . . /**/ DO IF #TRC_LVL GE 4. . /**/ COMPUTE #TRC_TAG = #TAG(#CKTG#). . /**/ PRINT / ' Ck tag' #CKTG# ', ' #TRC_TAG /**/ ' vs. ' #CKTAG. . /**/ END IF. . IF (#CKTAG = #TAG(#CKTG#)) #NXTG# = #CKTG# . - END IF. - END LOOP IF #NXTG# GT 0. * ---- If there was a colon, but it didn't delimit a tag, . * continue the search after it. . - DO IF (#COLON GT 0 AND #NXTG# EQ 0). /* Colon, but no tag */ . COMPUTE #BREAK = #BREAK + #COLON. . COMPUTE #TAIL= /* The new substring to search*/ SUBSTR(CUR_LINE,#BREAK). * Trace: where the new search begins, on the line . . /**/ DO IF #TRC_LVL GE 3. . /**/ COMPUTE #TRC_PC = ' '. . /**/ COMPUTE SUBSTR(#TRC_PC,#BREAK,1) = '|'. . /**/ PRINT / #TRC_PC. . /**/ END IF. * Trace: the substring to be searched . * (Again, this is "second-order"; omit if extraction is OK.). . /**/ DO IF #TRC_LVL GE 4. . /**/ PRINT / #TAIL. . /**/ END IF. - END IF. . /**/ DO IF #TRC_LVL GE 4. . /**/ PRINT / ' Colon#' #COLON# ', position' #COLON /**/ ' delimiting tag' #NXTG#. . /**/ END IF. - END LOOP IF #NXTG# GT 0 /* End when the next tag is found,*/ OR #COLON EQ 0. /* or it's known there isn't one */ - DO IF #NXTG# EQ 0. * ---- If the search did not find a tag, make "next tag" null. . COMPUTE #NXTG_BF = 0. . COMPUTE #NXTG_AF = 0. - ELSE. * ---- If the search found a tag, make it the "next tag" . . COMPUTE #PRTG# = #NXTG# . . COMPUTE #NXTG_AF = #COLON + #BREAK. . COMPUTE #NXTG_BF = #NXTG_AF - #TAGLN(#NXTG# ) - 1. - END IF. * Trace: Location of previous tag, whose text is being searched . * for, and the tag (if any) just found . . /**/ DO IF #TRC_LVL GE 3. . /**/ COMPUTE #TRC_PC = ' '. . /*-- COMPUTE SUBSTR(#TRC_PC,#BREAK,1) = '|'. . /**/ DO IF #CRTG# > 0. . COMPUTE SUBSTR(#TRC_PC,#CRTG_BF+1,#CRTG_AF-#CRTG_BF-1) = '---------'. . /**/ END IF. . /**/ DO IF #NXTG# > 0. . /*-- COMPUTE SUBSTR(#TRC_PC,#NXTG_BF,1) = '<'. /* Has BUG */ . /*-- COMPUTE SUBSTR(#TRC_PC,#NXTG_AF,1) = '>'. . COMPUTE SUBSTR(#TRC_PC,#NXTG_BF+1,#NXTG_AF-#NXTG_BF-1) = '.........'. . /**/ END IF. . /**/ PRINT / CUR_LINE. . /**/ PRINT / #TRC_PC. . /**/ END IF. * .... At this point, it's known either that there's a tag on . * the line after the #CRTG# tag (or after the beginning, . * if there's no #CRTG# tag), or that there's no such tag. . * Trace: Tag just found, if there is one . . /**/ DO IF #TRC_LVL GE 3. . /**/ DO IF #NXTG# GT 0. . /**/ COMPUTE #TRC_TAG = #TAG(#NXTG#). . /**/ ELSE. . /**/ COMPUTE #TRC_TAG = ''. . /**/ END IF. . /**/ Print / ' Next tag on line: ' #TRC_TAG. . /**/ END IF. * ---- Extract and store the text for tag #CRTG# . * #NEWSTRT /* Start point of tag text */ * #NEWLEN (F3). /* Length of tag text */ * #NEWTXT (A40). /* Tag text, extracted */ * Extract the text: . . COMPUTE #NEWSTRT = MAX(1,#CRTG_AF). - DO IF #NXTG# GT 0. * Text extends from previous tag to new tag . . COMPUTE #NEWLEN = #NXTG_BF - #NEWSTRT + 1. . COMPUTE #NEWTXT = SUBSTR(CUR_LINE,#NEWSTRT,#NEWLEN). - ELSE. * Text extends from previous tag to end of line . . COMPUTE #NEWTXT = SUBSTR(CUR_LINE,#NEWSTRT). - END IF. * Store the text, if there's a previous tag to store it for . - DO IF #CRTG# > 0. . COMPUTE #TAGTX(#CRTG#) = LTRIM(#NEWTXT). * Trace: Tag and its text . . /**/ DO IF #TRC_LVL GE 2. . /**/ COMPUTE #TRC_TAG = #TAG(#CRTG#). . /**/ COMPUTE #TRC_TXT = #TAGTX(#CRTG#). . /**/ PRINT / ' ' #TRC_TAG ' ' #TRC_TXT. . /**/ END IF. - ELSE IF LTRIM(#NEWTXT) NE ' '. . PRINT / ' ' 'Lost text' ' ' #NEWTXT. - END IF. * ---- Step one tag forward: the one just found is "current", . . COMPUTE #CRTG# = #NXTG#. . COMPUTE #CRTG_BF = #NXTG_BF. . COMPUTE #CRTG_AF = #NXTG_AF. * ---- and there's now "next" tag yet found . . COMPUTE #NXTG# = 0. . COMPUTE #NXTG_BF = 0. . COMPUTE #NXTG_AF = 0. END LOOP IF #CRTG# EQ 0. * + This ends the loop to process a line into tags and text . * Trace: Completion of a case line . . /**/ DO IF #TRC_LVL GE 1. . /**/ PRINT / 'Text of line completely processed'. . /**/ END IF. * #STAGE 2: End of processing, except for end-of-stage test . * WHEW!. * ---------------------------------------------------------- . * Conclusion of #STAGE 2, and #STAGE 3 . * Assumptions: . * - Every case has a "CHG:" tag, and it is the last tag of . * the case . * - The line following the line with the "CHG:" tag is a . * continuation of the text for the "CHG:" tag. . * #STAGE 2, concluded: If the last tag ("CHG:") has been read, . * end #STAGE 2, set #STAGE 3 so next line is read as . * the continuation line of the "CHG:" text. . DO IF #STAGE EQ 2 AND #PRTG# EQ 16. . COMPUTE #STAGE = 3. * Trace: Completion of the set of tags for a case . . /**/ DO IF #TRC_LVL GE 3. . /**/ PRINT / 'All tags for case have been processed'. . /**/ END IF. * #STAGE 3: Continuation line for "CHG:" tag . ELSE IF #STAGE EQ 3. . COMPUTE #TAGTX(16) = CONCAT(RTRIM(#TAGTX(16)),' ',CUR_LINE). * Trace: Tag and its completed text . . /**/ DO IF #TRC_LVL GE 1. . /**/ COMPUTE #TRC_TAG = #TAG(16). . /**/ COMPUTE #TRC_TXT = #TAGTX(16). . /**/ PRINT / ' ' 'With continuation line:'. . /**/ PRINT / ' ' #TRC_TAG ' ' #TRC_TXT. . /**/ END IF. . COMPUTE #STAGE = 4. * Trace: Completion of the set of tags for a case . . /**/ DO IF #TRC_LVL GE 1. . /**/ PRINT / 'All text for case has been read'. . /**/ END IF. END IF. * #STAGE 4: Store the output variables, write the case . * (No lines are read in this stage.) . DO IF #STAGE EQ 4. * + Reading a case: Compute output variables from tag texts . . COMPUTE UCN = #TAGTX1. . COMPUTE PRIM_REF = #TAGTX2. * Special: name as Last name, First name . - DO IF #TAGTX3 NE ' '. . COMPUTE #COMMA = INDEX(#TAGTX3,','). - DO IF #COMMA GT 0. . COMPUTE L_NAME = SUBSTR(#TAGTX3,1,#COMMA-1). . COMPUTE F_NAME = SUBSTR(#TAGTX3,#COMMA+1). - ELSE. . COMPUTE L_NAME = #TAGTX3. . COMPUTE F_NAME = ' '. - END IF. - END IF. . COMPUTE SPN = NUMBER(#TAGTX4,F8). . COMPUTE N_CTS = NUMBER(#TAGTX5,F8). . COMPUTE ARN = #TAGTX6. * DOA : #TAGTX7 (See dates). . COMPUTE SEX = #TAGTX8. * DOB : #TAGTX9 (See dates). . COMPUTE RACE = #TAGTX10. . COMPUTE CT = NUMBER(#TAGTX11,F8). . COMPUTE DEG = #TAGTX12. * DOO : #TAGTX13 (See dates). . COMPUTE REF = #TAGTX14. . COMPUTE OBTS = NUMBER(#TAGTX15,F8). . COMPUTE CHG = #TAGTX16. * Dates; special case . - DO REPEAT DATE = DOA DOB DOO /DATE_TXT= #TAGTX7 #TAGTX9 #TAGTX13. . COMPUTE #MONTH = NUMBER(SUBSTR(DATE_TXT,1,2),F2). . COMPUTE #DAY = NUMBER(SUBSTR(DATE_TXT,3,2),F2). . COMPUTE #YEAR = NUMBER(SUBSTR(DATE_TXT,5,2),F2). . COMPUTE #YEAR = #YEAR + 2000. . IF (#YEAR GE 2080) #YEAR = #YEAR - 100. . COMPUTE DATE = DATE.MDY(#MONTH,#DAY,#YEAR). - END REPEAT. * Clear test of the last input line . . COMPUTE CUR_LINE = ' '. * + Reading a case: DONE. Write it out. . . END CASE. * + Clear all buffers, reset to #STAGE 0 . . /**/ DO IF #TRC_LVL GE 1. . /**/ PRINT / 'Case completely processed'. . /**/ END IF. - LOOP #TAG# =1 TO 16. . COMPUTE #TAGTX(#TAG#) = ' '. - END LOOP. . COMPUTE #STAGE = 0. END IF. * ---- OK, some bells and whistles .... ------ . VARIABLE WIDTH UCN (16). VARIABLE WIDTH case_num LINE_NUM ( 8). VARIABLE WIDTH PRIM_REF REF (13). VARIABLE WIDTH L_NAME f_name (10). VARIABLE WIDTH spn ( 8). VARIABLE WIDTH n_cts CT ( 4). VARIABLE WIDTH SEX RACE ( 4). VARIABLE WIDTH DEG ( 3). VARIABLE WIDTH obts ( 8). VARIABLE WIDTH chg (27). VAR WIDTH DOA DOB DOO (10). VAR ALIGN DOA DOB DOO (CENTER). VARIABLE WIDTH cur_line ( 6). END INPUT PROGRAM. * ---------------------------------------------------------- . * ----- T h i s i s t h e t e s t d a t a ----- . BEGIN DATA. UCN:522004CF007297:XXXNO PRIM REF:CRC0407297CFANO NAME:HAMILTON,MYLAN MIRACLE SPN:00567068 #CTS:01 ARN:SP0310002 DOA:050204 SEX: M DOB: 010286 RACE:B CT:01 DEG:3F DOO:043004 REF:CRC0407297CFANO OBTS:5231002230 CHG:FAILURE TO APPEAR UCN:522004CF007587XXXXNO PRIM REF:CRC0407587CFANO NAME:NORRIS,QUINTON IVIE SPN:00669155 #CTS:01 ARN:SO04105538 DOA:050304 SEX: M DOB: 082283 RACE:B CT:01 DEG: DOO:043004 REF:CRC0407587CFANO OBTS: CHG:POSS MARIJUANA W/INTENT TO DISTRIBUTE 03/17/05 PINELLAS COUNTY CRIMINAL JUSTICE PAGE 2 STATE COURT PROCESSING STATISTICS (SCPS) ADVISORY FOR 05/03/2004 UCN:522004CF007588XXXXNO PRIM REF:CRC0407588CFANO NAME:NORRIS,QUINTON IVIE SPN:00669155 #CTS:01 ARN:SO04105538 DOA:050304 SEX: M DOB: 082283 RACE:B CT:01 DEG: DOO:050304 REF:CRC0407588CFANO OBTS:5205057677 CHG:TAMPERING W/PHYSICAL EVIDENCE UCN:522004CF007591XXXXNO PRIM REF:CRC0407591CFANO NAME:VALENTINE,PETER BRIAN SPN:00705111 #CTS:01 ARN:SP04028173 DOA:050304 SEX: M DOB: 111784 RACE:W CT:01 DEG: DOO:050204 REF:CRC0407591CFANO OBTS:5202071774 CHG:DWLS/R #9461DBT *CALL OF COU END DATA. * ---------------------------------------------------------- . LIST CASE_NUM UCN PRIM_REF REF. LIST CASE_NUM UCN L_NAME F_NAME SEX DOB RACE. LIST CASE_NUM UCN SPN N_CTS CT ARN DOA DOO. LIST CASE_NUM UCN REF OBTS. LIST CASE_NUM DEG CHG. /**/ * ---------------------------------------------------------- . * New set of LISTs, still narrower on the line: . LIST CASE_NUM UCN PRIM_REF REF. LIST CASE_NUM SPN OBTS. LIST CASE_NUM L_NAME F_NAME SEX DOB RACE. LIST CASE_NUM N_CTS CT ARN DOA DOO. LIST CASE_NUM DEG CHG.