C0CRXNRD ; WV/SMH - CCR/CCD PROJECT: Routine to Read RxNorm files;11/15/08
 ;;0.1;C0C;nopatch;noreleasedate;Build 6
 W "No entry from top" Q
IMPORT(PATH) 
 I PATH="" QUIT
 D READSRC(PATH),READCON(PATH),READNDC(PATH)
 QUIT
 ;
DELFILED(FN) ; Delete file data; PEP procedure; only for RxNorm files
 ; FN is Filenumber passed by Value
 QUIT:$E(FN,1,3)'=176  ; Quit if not RxNorm files
 D CLEAN^DILF ; Clean FM variables
 N ROOT S ROOT=$$ROOT^DILFD(FN,"",1) ; global root
 N ZERO S ZERO=@ROOT@(0) ; Save zero node
 S $P(ZERO,U,3,9999)="" ; Remove entry # and last edited
 K @ROOT ; Kill the file -- so sad!
 S @ROOT@(0)=ZERO ; It riseth again!
 QUIT
GETLINES(PATH,FILENAME) ; Get number of lines in a file
 D OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 U IO
 N I
 F I=1:1 R LINE Q:$$STATUS^%ZISH
 D CLOSE^%ZISH("FILE")
 Q I-1
READCON(PATH,INCRES) ; Open and read concepts file: RXNCONSO.RRF; EP
 ; PATH ByVal, path of RxNorm files
 ; INCRES ByVal, include restricted sources. 1 for yes, 0 for no
 I PATH="" QUIT
 S INCRES=+$G(INCRES) ; if not passed, becomes zero.
 N FILENAME S FILENAME="RXNCONSO.RRF"
 D DELFILED(176.001) ; delete data
 N LINES S LINES=$$GETLINES(PATH,FILENAME)
 D OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 IF POP D EN^DDIOL("Error reading file..., Please check...") G EX
 N C0CCOUNT
 F C0CCOUNT=1:1 D  Q:$$STATUS^%ZISH
 . U IO
 . N LINE R LINE
 . IF $$STATUS^%ZISH QUIT
 . I '(C0CCOUNT#1000) U $P W C0CCOUNT," of ",LINES," read ",! U IO ; update every 1000
 . N RXCUI,RXAUI,SAB,TTY,CODE,STR  ; Fileman fields numbers below
 . S RXCUI=$P(LINE,"|",1)	; .01
 . S RXAUI=$P(LINE,"|",8)	; 1
 . S SAB=$P(LINE,"|",12)	; 2
 . ; If the source is a restricted source, decide what to do based on what's asked.
 . N SRCIEN S SRCIEN=$$FIND1^DIC(176.003,"","QX",SAB,"B") ; SrcIEN in RXNORM SOURCES file
 . N RESTRIC S RESTRIC=$$GET1^DIQ(176.003,SRCIEN,14,"I") ; 14 is restriction field; values 0-4
 . ; If RESTRIC is zero, then it's unrestricted. Everything else is restricted.
 . ; If user didn't ask to include restricted sources, and the source is restricted, then quit
 . I 'INCRES,RESTRIC QUIT
 . S TTY=$P(LINE,"|",13)	; 3
 . S CODE=$P(LINE,"|",14)	; 4
 . S STR=$P(LINE,"|",15)	; 5
 . ; Remove embedded "^"
 . S STR=$TR(STR,"^")
 . ; Convert STR into an array of 80 characters on each line
 . N STRLINE S STRLINE=$L(STR)\80+1
 . ; In each line, chop 80 characters off, reset STR to be the rest
 . N J F J=1:1:STRLINE S STR(J)=$E(STR,1,80) S STR=$E(STR,81,$L(STR))
 . ; Now, construct the FDA array
 . N RXNFDA
 . S RXNFDA(176.001,"+1,",.01)=RXCUI
 . S RXNFDA(176.001,"+1,",1)=RXAUI
 . S RXNFDA(176.001,"+1,",2)=SAB
 . S RXNFDA(176.001,"+1,",3)=TTY
 . S RXNFDA(176.001,"+1,",4)=CODE
 . N RXNIEN S RXNIEN(1)=C0CCOUNT
 . D UPDATE^DIE("","RXNFDA","RXNIEN")
 . I $D(^TMP("DIERR",$J)) D EN^DDIOL("ERROR") G EX
 . ; Now, file WP field STR
 . D WP^DIE(176.001,C0CCOUNT_",",5,,$NA(STR))
EX D CLOSE^%ZISH("FILE")
 QUIT
READNDC(PATH) ; Open and read NDC/RxNorm/VANDF relationship file: RXNSAT.RRF
 I PATH="" QUIT
 N FILENAME S FILENAME="RXNSAT.RRF"
 D DELFILED(176.002) ; delete data
 N LINES S LINES=$$GETLINES(PATH,FILENAME)
 D OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 IF POP W "Error reading file..., Please check...",! G EX2
 F C0CCOUNT=1:1 Q:$$STATUS^%ZISH  D
 . U IO
 . N LINE R LINE
 . IF $$STATUS^%ZISH QUIT
 . I '(C0CCOUNT#1000) U $P W C0CCOUNT," of ",LINES," read ",! U IO ; update every 1000
 . IF LINE'["NDC|RXNORM"  QUIT
 . ; Otherwise, we are good to go
 . N RXCUI,NDC ; Fileman fields below
 . S RXCUI=$P(LINE,"|",1)	; .01
 . S NDC=$P(LINE,"|",11)	; 2
 . ; Using classic call to update.
 . N DIC,X,DA,DR
 . K DO
 . S DIC="^C0CRXN(176.002,",DIC(0)="F",X=RXCUI,DIC("DR")="2////"_NDC
 . D FILE^DICN
 . I Y<1 U $P W !,"THERE IS TROUBLE IN RIVER CITY",! G EX2
EX2 D CLOSE^%ZISH("FILE")
 QUIT
READSRC(PATH) ; Open the read RxNorm Sources file: RXNSAB.RRF
 I PATH="" QUIT
 N FILENAME S FILENAME="RXNSAB.RRF"
 D DELFILED(176.003) ; delete data
 D OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 IF POP W "Error reading file..., Please check...",! G EX3
 F I=1:1 Q:$$STATUS^%ZISH  D
 . U IO
 . N LINE R LINE
 . IF $$STATUS^%ZISH QUIT
 . U $P W I,! U IO  ; Write I to the screen, then go back to reading the file
 . N VCUI,RCUI,VSAB,RSAB,SON,SF,SVER,SRL,SCIT ; Fileman fields numbers below
 . S VCUI=$P(LINE,"|",1)        ; .01
 . S RCUI=$P(LINE,"|",2)        ; 2
 . S VSAB=$P(LINE,"|",3)        ; 3
 . S RSAB=$P(LINE,"|",4)        ; 4
 . S SON=$P(LINE,"|",5)         ; 5
 . S SF=$P(LINE,"|",6)          ; 6
 . S SVER=$P(LINE,"|",7)        ; 7
 . S SRL=$P(LINE,"|",14)		; 14
 . S SCIT=$P(LINE,"|",25)       ; 25
 . ; Remove embedded "^"
 . S SCIT=$TR(SCIT,"^")
 . ; Convert SCIT into an array of 80 characters on each line
 . ; In each line, chop 80 characters off, reset SCIT to be the rest
 . N SCITLINE S SCITLINE=$L(SCIT)\80+1
 . F J=1:1:SCITLINE S SCIT(J)=$E(SCIT,1,80) S SCIT=$E(SCIT,81,$L(SCIT))
 . ; Now, construct the FDA array
 . N RXNFDA
 . S RXNFDA(176.003,"+"_I_",",.01)=VCUI
 . S RXNFDA(176.003,"+"_I_",",2)=RCUI
 . S RXNFDA(176.003,"+"_I_",",3)=VSAB
 . S RXNFDA(176.003,"+"_I_",",4)=RSAB
 . S RXNFDA(176.003,"+"_I_",",5)=SON
 . S RXNFDA(176.003,"+"_I_",",6)=SF
 . S RXNFDA(176.003,"+"_I_",",7)=SVER
 . S RXNFDA(176.003,"+"_I_",",14)=SRL
 . D UPDATE^DIE("","RXNFDA")
 . I $D(^TMP("DIERR",$J)) U $P W "ERR" G EX
 . ; Now, file WP field SCIT
 . D WP^DIE(176.003,I_",",25,,$NA(SCIT))
EX3 D CLOSE^%ZISH("FILE")
 Q
 
C0CRXNRD  ; WV/SMH - CCR/CCD PROJECT: Routine to Read RxNorm files;11/15/08
 +1       ;;0.1;C0C;nopatch;noreleasedate;Build 6
 +2        WRITE "No entry from top"
           QUIT 
IMPORT(PATH)  +1  IF PATH=""
               QUIT 
 +2        DO READSRC(PATH)
           DO READCON(PATH)
           DO READNDC(PATH)
 +3        QUIT 
 +4       ;
DELFILED(FN) ; Delete file data; PEP procedure; only for RxNorm files
 +1       ; FN is Filenumber passed by Value
 +2       ; Quit if not RxNorm files
           IF $EXTRACT(FN,1,3)'=176
               QUIT 
 +3       ; Clean FM variables
           DO CLEAN^DILF
 +4       ; global root
           NEW ROOT
           SET ROOT=$$ROOT^DILFD(FN,"",1)
 +5       ; Save zero node
           NEW ZERO
           SET ZERO=@ROOT@(0)
 +6       ; Remove entry # and last edited
           SET $PIECE(ZERO,U,3,9999)=""
 +7       ; Kill the file -- so sad!
           KILL @ROOT
 +8       ; It riseth again!
           SET @ROOT@(0)=ZERO
 +9        QUIT 
GETLINES(PATH,FILENAME) ; Get number of lines in a file
 +1        DO OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 +2        USE IO
 +3        NEW I
 +4        FOR I=1:1
               READ LINE
               IF $$STATUS^%ZISH
                   QUIT 
 +5        DO CLOSE^%ZISH("FILE")
 +6        QUIT I-1
READCON(PATH,INCRES) ; Open and read concepts file: RXNCONSO.RRF; EP
 +1       ; PATH ByVal, path of RxNorm files
 +2       ; INCRES ByVal, include restricted sources. 1 for yes, 0 for no
 +3        IF PATH=""
               QUIT 
 +4       ; if not passed, becomes zero.
           SET INCRES=+$GET(INCRES)
 +5        NEW FILENAME
           SET FILENAME="RXNCONSO.RRF"
 +6       ; delete data
           DO DELFILED(176.001)
 +7        NEW LINES
           SET LINES=$$GETLINES(PATH,FILENAME)
 +8        DO OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 +9        IF POP
               DO EN^DDIOL("Error reading file..., Please check...")
               GOTO EX
 +10       NEW C0CCOUNT
 +11       FOR C0CCOUNT=1:1
               Begin DoDot:1
 +12               USE IO
 +13               NEW LINE
                   READ LINE
 +14               IF $$STATUS^%ZISH
                       QUIT 
 +15      ; update every 1000
                   IF '(C0CCOUNT#1000)
                       USE $PRINCIPAL
                       WRITE C0CCOUNT," of ",LINES," read ",!
                       USE IO
 +16      ; Fileman fields numbers below
                   NEW RXCUI,RXAUI,SAB,TTY,CODE,STR
 +17      ; .01
                   SET RXCUI=$PIECE(LINE,"|",1)
 +18      ; 1
                   SET RXAUI=$PIECE(LINE,"|",8)
 +19      ; 2
                   SET SAB=$PIECE(LINE,"|",12)
 +20      ; If the source is a restricted source, decide what to do based on what's asked.
 +21      ; SrcIEN in RXNORM SOURCES file
                   NEW SRCIEN
                   SET SRCIEN=$$FIND1^DIC(176.003,"","QX",SAB,"B")
 +22      ; 14 is restriction field; values 0-4
                   NEW RESTRIC
                   SET RESTRIC=$$GET1^DIQ(176.003,SRCIEN,14,"I")
 +23      ; If RESTRIC is zero, then it's unrestricted. Everything else is restricted.
 +24      ; If user didn't ask to include restricted sources, and the source is restricted, then quit
 +25               IF 'INCRES
                       IF RESTRIC
                           QUIT 
 +26      ; 3
                   SET TTY=$PIECE(LINE,"|",13)
 +27      ; 4
                   SET CODE=$PIECE(LINE,"|",14)
 +28      ; 5
                   SET STR=$PIECE(LINE,"|",15)
 +29      ; Remove embedded "^"
 +30               SET STR=$TRANSLATE(STR,"^")
 +31      ; Convert STR into an array of 80 characters on each line
 +32               NEW STRLINE
                   SET STRLINE=$LENGTH(STR)\80+1
 +33      ; In each line, chop 80 characters off, reset STR to be the rest
 +34               NEW J
                   FOR J=1:1:STRLINE
                       SET STR(J)=$EXTRACT(STR,1,80)
                       SET STR=$EXTRACT(STR,81,$LENGTH(STR))
 +35      ; Now, construct the FDA array
 +36               NEW RXNFDA
 +37               SET RXNFDA(176.001,"+1,",.01)=RXCUI
 +38               SET RXNFDA(176.001,"+1,",1)=RXAUI
 +39               SET RXNFDA(176.001,"+1,",2)=SAB
 +40               SET RXNFDA(176.001,"+1,",3)=TTY
 +41               SET RXNFDA(176.001,"+1,",4)=CODE
 +42               NEW RXNIEN
                   SET RXNIEN(1)=C0CCOUNT
 +43               DO UPDATE^DIE("","RXNFDA","RXNIEN")
 +44               IF $DATA(^TMP("DIERR",$JOB))
                       DO EN^DDIOL("ERROR")
                       GOTO EX
 +45      ; Now, file WP field STR
 +46               DO WP^DIE(176.001,C0CCOUNT_",",5,,$NAME(STR))
               End DoDot:1
               IF $$STATUS^%ZISH
                   QUIT 
EX         DO CLOSE^%ZISH("FILE")
 +1        QUIT 
READNDC(PATH) ; Open and read NDC/RxNorm/VANDF relationship file: RXNSAT.RRF
 +1        IF PATH=""
               QUIT 
 +2        NEW FILENAME
           SET FILENAME="RXNSAT.RRF"
 +3       ; delete data
           DO DELFILED(176.002)
 +4        NEW LINES
           SET LINES=$$GETLINES(PATH,FILENAME)
 +5        DO OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 +6        IF POP
               WRITE "Error reading file..., Please check...",!
               GOTO EX2
 +7        FOR C0CCOUNT=1:1
               IF $$STATUS^%ZISH
                   QUIT 
               Begin DoDot:1
 +8                USE IO
 +9                NEW LINE
                   READ LINE
 +10               IF $$STATUS^%ZISH
                       QUIT 
 +11      ; update every 1000
                   IF '(C0CCOUNT#1000)
                       USE $PRINCIPAL
                       WRITE C0CCOUNT," of ",LINES," read ",!
                       USE IO
 +12               IF LINE'["NDC|RXNORM"
                       QUIT 
 +13      ; Otherwise, we are good to go
 +14      ; Fileman fields below
                   NEW RXCUI,NDC
 +15      ; .01
                   SET RXCUI=$PIECE(LINE,"|",1)
 +16      ; 2
                   SET NDC=$PIECE(LINE,"|",11)
 +17      ; Using classic call to update.
 +18               NEW DIC,X,DA,DR
 +19               KILL DO
 +20               SET DIC="^C0CRXN(176.002,"
                   SET DIC(0)="F"
                   SET X=RXCUI
                   SET DIC("DR")="2////"_NDC
 +21               DO FILE^DICN
 +22               IF Y<1
                       USE $PRINCIPAL
                       WRITE !,"THERE IS TROUBLE IN RIVER CITY",!
                       GOTO EX2
               End DoDot:1
EX2        DO CLOSE^%ZISH("FILE")
 +1        QUIT 
READSRC(PATH) ; Open the read RxNorm Sources file: RXNSAB.RRF
 +1        IF PATH=""
               QUIT 
 +2        NEW FILENAME
           SET FILENAME="RXNSAB.RRF"
 +3       ; delete data
           DO DELFILED(176.003)
 +4        DO OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 +5        IF POP
               WRITE "Error reading file..., Please check...",!
               GOTO EX3
 +6        FOR I=1:1
               IF $$STATUS^%ZISH
                   QUIT 
               Begin DoDot:1
 +7                USE IO
 +8                NEW LINE
                   READ LINE
 +9                IF $$STATUS^%ZISH
                       QUIT 
 +10      ; Write I to the screen, then go back to reading the file
                   USE $PRINCIPAL
                   WRITE I,!
                   USE IO
 +11      ; Fileman fields numbers below
                   NEW VCUI,RCUI,VSAB,RSAB,SON,SF,SVER,SRL,SCIT
 +12      ; .01
                   SET VCUI=$PIECE(LINE,"|",1)
 +13      ; 2
                   SET RCUI=$PIECE(LINE,"|",2)
 +14      ; 3
                   SET VSAB=$PIECE(LINE,"|",3)
 +15      ; 4
                   SET RSAB=$PIECE(LINE,"|",4)
 +16      ; 5
                   SET SON=$PIECE(LINE,"|",5)
 +17      ; 6
                   SET SF=$PIECE(LINE,"|",6)
 +18      ; 7
                   SET SVER=$PIECE(LINE,"|",7)
 +19      ; 14
                   SET SRL=$PIECE(LINE,"|",14)	
 +20      ; 25
                   SET SCIT=$PIECE(LINE,"|",25)
 +21      ; Remove embedded "^"
 +22               SET SCIT=$TRANSLATE(SCIT,"^")
 +23      ; Convert SCIT into an array of 80 characters on each line
 +24      ; In each line, chop 80 characters off, reset SCIT to be the rest
 +25               NEW SCITLINE
                   SET SCITLINE=$LENGTH(SCIT)\80+1
 +26               FOR J=1:1:SCITLINE
                       SET SCIT(J)=$EXTRACT(SCIT,1,80)
                       SET SCIT=$EXTRACT(SCIT,81,$LENGTH(SCIT))
 +27      ; Now, construct the FDA array
 +28               NEW RXNFDA
 +29               SET RXNFDA(176.003,"+"_I_",",.01)=VCUI
 +30               SET RXNFDA(176.003,"+"_I_",",2)=RCUI
 +31               SET RXNFDA(176.003,"+"_I_",",3)=VSAB
 +32               SET RXNFDA(176.003,"+"_I_",",4)=RSAB
 +33               SET RXNFDA(176.003,"+"_I_",",5)=SON
 +34               SET RXNFDA(176.003,"+"_I_",",6)=SF
 +35               SET RXNFDA(176.003,"+"_I_",",7)=SVER
 +36               SET RXNFDA(176.003,"+"_I_",",14)=SRL
 +37               DO UPDATE^DIE("","RXNFDA")
 +38               IF $DATA(^TMP("DIERR",$JOB))
                       USE $PRINCIPAL
                       WRITE "ERR"
                       GOTO EX
 +39      ; Now, file WP field SCIT
 +40               DO WP^DIE(176.003,I_",",25,,$NAME(SCIT))
               End DoDot:1
EX3        DO CLOSE^%ZISH("FILE")
 +1        QUIT 
 +2 
*****   ERRORS & WARNINGS IN C0CRXNRD   *****
   IMPORT       W - Null line (no commands or comment).
   READCON+17   W - Line contains a CONTROL (non-graphic) character.
   READCON+17   F - Invalid or wrong number of arguments to a function.
   READCON+17   W - Invalid local variable name.
   READCON+17   F - UNDEFINED COMMAND (rest of line not checked).
   READCON+18   W - Line contains a CONTROL (non-graphic) character.
   READCON+18   F - Invalid or wrong number of arguments to a function.
   READCON+18   W - Invalid local variable name.
   READCON+18   F - UNDEFINED COMMAND (rest of line not checked).
   READCON+19   W - Line contains a CONTROL (non-graphic) character.
   READCON+19   F - Invalid or wrong number of arguments to a function.
   READCON+19   W - Invalid local variable name.
   READCON+19   F - UNDEFINED COMMAND (rest of line not checked).
   READCON+26   W - Line contains a CONTROL (non-graphic) character.
   READCON+26   F - Invalid or wrong number of arguments to a function.
   READCON+26   W - Invalid local variable name.
   READCON+26   F - UNDEFINED COMMAND (rest of line not checked).
   READCON+27   W - Line contains a CONTROL (non-graphic) character.
   READCON+27   F - Invalid or wrong number of arguments to a function.
   READCON+27   W - Invalid local variable name.
   READCON+27   F - UNDEFINED COMMAND (rest of line not checked).
   READCON+28   W - Line contains a CONTROL (non-graphic) character.
   READCON+28   F - Invalid or wrong number of arguments to a function.
   READCON+28   W - Invalid local variable name.
   READCON+28   F - UNDEFINED COMMAND (rest of line not checked).
   READNDC+15   W - Line contains a CONTROL (non-graphic) character.
   READNDC+15   F - Invalid or wrong number of arguments to a function.
   READNDC+15   W - Invalid local variable name.
   READNDC+15   F - UNDEFINED COMMAND (rest of line not checked).
   READNDC+16   W - Line contains a CONTROL (non-graphic) character.
   READNDC+16   F - Invalid or wrong number of arguments to a function.
   READNDC+16   W - Invalid local variable name.
   READNDC+16   F - UNDEFINED COMMAND (rest of line not checked).
   READSRC+19   W - Line contains a CONTROL (non-graphic) character.
   READSRC+19   F - Invalid or wrong number of arguments to a function.
   READSRC+19   W - Invalid local variable name.
   READSRC+19   F - UNDEFINED COMMAND (rest of line not checked).
   EX3+2        W - Null line (no commands or comment).