| 1 | C0CRXNRD        ; WV/SMH - CCR/CCD PROJECT: Routine to Read RxNorm files;11/15/08
 | 
|---|
| 2 |         ;;1.2;C0C;;May 11, 2012;Build 47
 | 
|---|
| 3 |         W "No entry from top" Q
 | 
|---|
| 4 | IMPORT(PATH)    
 | 
|---|
| 5 |         I PATH="" QUIT
 | 
|---|
| 6 |         D READSRC(PATH),READCON(PATH),READNDC(PATH)
 | 
|---|
| 7 |         QUIT
 | 
|---|
| 8 |         ;
 | 
|---|
| 9 | DELFILED(FN)    ; Delete file data; PEP procedure; only for RxNorm files
 | 
|---|
| 10 |         ; FN is Filenumber passed by Value
 | 
|---|
| 11 |         QUIT:$E(FN,1,3)'=176  ; Quit if not RxNorm files
 | 
|---|
| 12 |         D CLEAN^DILF ; Clean FM variables
 | 
|---|
| 13 |         N ROOT S ROOT=$$ROOT^DILFD(FN,"",1) ; global root
 | 
|---|
| 14 |         N ZERO S ZERO=@ROOT@(0) ; Save zero node
 | 
|---|
| 15 |         S $P(ZERO,U,3,9999)="" ; Remove entry # and last edited
 | 
|---|
| 16 |         K @ROOT ; Kill the file -- so sad!
 | 
|---|
| 17 |         S @ROOT@(0)=ZERO ; It riseth again!
 | 
|---|
| 18 |         QUIT
 | 
|---|
| 19 | GETLINES(PATH,FILENAME) ; Get number of lines in a file
 | 
|---|
| 20 |         D OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 | 
|---|
| 21 |         U IO
 | 
|---|
| 22 |         N I
 | 
|---|
| 23 |         F I=1:1 R LINE Q:$$STATUS^%ZISH
 | 
|---|
| 24 |         D CLOSE^%ZISH("FILE")
 | 
|---|
| 25 |         Q I-1
 | 
|---|
| 26 | READCON(PATH,INCRES)    ; Open and read concepts file: RXNCONSO.RRF; EP
 | 
|---|
| 27 |         ; PATH ByVal, path of RxNorm files
 | 
|---|
| 28 |         ; INCRES ByVal, include restricted sources. 1 for yes, 0 for no
 | 
|---|
| 29 |         I PATH="" QUIT
 | 
|---|
| 30 |         S INCRES=+$G(INCRES) ; if not passed, becomes zero.
 | 
|---|
| 31 |         N FILENAME S FILENAME="RXNCONSO.RRF"
 | 
|---|
| 32 |         D DELFILED(176.001) ; delete data
 | 
|---|
| 33 |         N LINES S LINES=$$GETLINES(PATH,FILENAME)
 | 
|---|
| 34 |         D OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 | 
|---|
| 35 |         IF POP D EN^DDIOL("Error reading file..., Please check...") G EX
 | 
|---|
| 36 |         N C0CCOUNT
 | 
|---|
| 37 |         F C0CCOUNT=1:1 D  Q:$$STATUS^%ZISH
 | 
|---|
| 38 |         . U IO
 | 
|---|
| 39 |         . N LINE R LINE
 | 
|---|
| 40 |         . IF $$STATUS^%ZISH QUIT
 | 
|---|
| 41 |         . I '(C0CCOUNT#1000) U $P W C0CCOUNT," of ",LINES," read ",! U IO ; update every 1000
 | 
|---|
| 42 |         . N RXCUI,RXAUI,SAB,TTY,CODE,STR  ; Fileman fields numbers below
 | 
|---|
| 43 |         . S RXCUI=$P(LINE,"|",1) ; .01
 | 
|---|
| 44 |         . S RXAUI=$P(LINE,"|",8) ; 1
 | 
|---|
| 45 |         . S SAB=$P(LINE,"|",12) ; 2
 | 
|---|
| 46 |         . ; If the source is a restricted source, decide what to do based on what's asked.
 | 
|---|
| 47 |         . N SRCIEN S SRCIEN=$$FIND1^DIC(176.003,"","QX",SAB,"B") ; SrcIEN in RXNORM SOURCES file
 | 
|---|
| 48 |         . N RESTRIC S RESTRIC=$$GET1^DIQ(176.003,SRCIEN,14,"I") ; 14 is restriction field; values 0-4
 | 
|---|
| 49 |         . ; If RESTRIC is zero, then it's unrestricted. Everything else is restricted.
 | 
|---|
| 50 |         . ; If user didn't ask to include restricted sources, and the source is restricted, then quit
 | 
|---|
| 51 |         . I 'INCRES,RESTRIC QUIT
 | 
|---|
| 52 |         . S TTY=$P(LINE,"|",13) ; 3
 | 
|---|
| 53 |         . S CODE=$P(LINE,"|",14) ; 4
 | 
|---|
| 54 |         . S STR=$P(LINE,"|",15) ; 5
 | 
|---|
| 55 |         . ; Remove embedded "^"
 | 
|---|
| 56 |         . S STR=$TR(STR,"^")
 | 
|---|
| 57 |         . ; Convert STR into an array of 80 characters on each line
 | 
|---|
| 58 |         . N STRLINE S STRLINE=$L(STR)\80+1
 | 
|---|
| 59 |         . ; In each line, chop 80 characters off, reset STR to be the rest
 | 
|---|
| 60 |         . N J F J=1:1:STRLINE S STR(J)=$E(STR,1,80) S STR=$E(STR,81,$L(STR))
 | 
|---|
| 61 |         . ; Now, construct the FDA array
 | 
|---|
| 62 |         . N RXNFDA
 | 
|---|
| 63 |         . S RXNFDA(176.001,"+1,",.01)=RXCUI
 | 
|---|
| 64 |         . S RXNFDA(176.001,"+1,",1)=RXAUI
 | 
|---|
| 65 |         . S RXNFDA(176.001,"+1,",2)=SAB
 | 
|---|
| 66 |         . S RXNFDA(176.001,"+1,",3)=TTY
 | 
|---|
| 67 |         . S RXNFDA(176.001,"+1,",4)=CODE
 | 
|---|
| 68 |         . N RXNIEN S RXNIEN(1)=C0CCOUNT
 | 
|---|
| 69 |         . D UPDATE^DIE("","RXNFDA","RXNIEN")
 | 
|---|
| 70 |         . I $D(^TMP("DIERR",$J)) D EN^DDIOL("ERROR") G EX
 | 
|---|
| 71 |         . ; Now, file WP field STR
 | 
|---|
| 72 |         . D WP^DIE(176.001,C0CCOUNT_",",5,,$NA(STR))
 | 
|---|
| 73 | EX      D CLOSE^%ZISH("FILE")
 | 
|---|
| 74 |         QUIT
 | 
|---|
| 75 | READNDC(PATH)   ; Open and read NDC/RxNorm/VANDF relationship file: RXNSAT.RRF
 | 
|---|
| 76 |         I PATH="" QUIT
 | 
|---|
| 77 |         N FILENAME S FILENAME="RXNSAT.RRF"
 | 
|---|
| 78 |         D DELFILED(176.002) ; delete data
 | 
|---|
| 79 |         N LINES S LINES=$$GETLINES(PATH,FILENAME)
 | 
|---|
| 80 |         D OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 | 
|---|
| 81 |         IF POP W "Error reading file..., Please check...",! G EX2
 | 
|---|
| 82 |         F C0CCOUNT=1:1 Q:$$STATUS^%ZISH  D
 | 
|---|
| 83 |         . U IO
 | 
|---|
| 84 |         . N LINE R LINE
 | 
|---|
| 85 |         . IF $$STATUS^%ZISH QUIT
 | 
|---|
| 86 |         . I '(C0CCOUNT#1000) U $P W C0CCOUNT," of ",LINES," read ",! U IO ; update every 1000
 | 
|---|
| 87 |         . IF LINE'["NDC|RXNORM"  QUIT
 | 
|---|
| 88 |         . ; Otherwise, we are good to go
 | 
|---|
| 89 |         . N RXCUI,NDC ; Fileman fields below
 | 
|---|
| 90 |         . S RXCUI=$P(LINE,"|",1) ; .01
 | 
|---|
| 91 |         . S NDC=$P(LINE,"|",11) ; 2
 | 
|---|
| 92 |         . ; Using classic call to update.
 | 
|---|
| 93 |         . N DIC,X,DA,DR
 | 
|---|
| 94 |         . K DO
 | 
|---|
| 95 |         . S DIC="^C0CRXN(176.002,",DIC(0)="F",X=RXCUI,DIC("DR")="2////"_NDC
 | 
|---|
| 96 |         . D FILE^DICN
 | 
|---|
| 97 |         . I Y<1 U $P W !,"THERE IS TROUBLE IN RIVER CITY",! G EX2
 | 
|---|
| 98 | EX2     D CLOSE^%ZISH("FILE")
 | 
|---|
| 99 |         QUIT
 | 
|---|
| 100 | READSRC(PATH)   ; Open the read RxNorm Sources file: RXNSAB.RRF
 | 
|---|
| 101 |         I PATH="" QUIT
 | 
|---|
| 102 |         N FILENAME S FILENAME="RXNSAB.RRF"
 | 
|---|
| 103 |         D DELFILED(176.003) ; delete data
 | 
|---|
| 104 |         D OPEN^%ZISH("FILE",PATH,FILENAME,"R")
 | 
|---|
| 105 |         IF POP W "Error reading file..., Please check...",! G EX3
 | 
|---|
| 106 |         F I=1:1 Q:$$STATUS^%ZISH  D
 | 
|---|
| 107 |         . U IO
 | 
|---|
| 108 |         . N LINE R LINE
 | 
|---|
| 109 |         . IF $$STATUS^%ZISH QUIT
 | 
|---|
| 110 |         . U $P W I,! U IO  ; Write I to the screen, then go back to reading the file
 | 
|---|
| 111 |         . N VCUI,RCUI,VSAB,RSAB,SON,SF,SVER,SRL,SCIT ; Fileman fields numbers below
 | 
|---|
| 112 |         . S VCUI=$P(LINE,"|",1)        ; .01
 | 
|---|
| 113 |         . S RCUI=$P(LINE,"|",2)        ; 2
 | 
|---|
| 114 |         . S VSAB=$P(LINE,"|",3)        ; 3
 | 
|---|
| 115 |         . S RSAB=$P(LINE,"|",4)        ; 4
 | 
|---|
| 116 |         . S SON=$P(LINE,"|",5)         ; 5
 | 
|---|
| 117 |         . S SF=$P(LINE,"|",6)          ; 6
 | 
|---|
| 118 |         . S SVER=$P(LINE,"|",7)        ; 7
 | 
|---|
| 119 |         . S SRL=$P(LINE,"|",14)  ; 14
 | 
|---|
| 120 |         . S SCIT=$P(LINE,"|",25)       ; 25
 | 
|---|
| 121 |         . ; Remove embedded "^"
 | 
|---|
| 122 |         . S SCIT=$TR(SCIT,"^")
 | 
|---|
| 123 |         . ; Convert SCIT into an array of 80 characters on each line
 | 
|---|
| 124 |         . ; In each line, chop 80 characters off, reset SCIT to be the rest
 | 
|---|
| 125 |         . N SCITLINE S SCITLINE=$L(SCIT)\80+1
 | 
|---|
| 126 |         . F J=1:1:SCITLINE S SCIT(J)=$E(SCIT,1,80) S SCIT=$E(SCIT,81,$L(SCIT))
 | 
|---|
| 127 |         . ; Now, construct the FDA array
 | 
|---|
| 128 |         . N RXNFDA
 | 
|---|
| 129 |         . S RXNFDA(176.003,"+"_I_",",.01)=VCUI
 | 
|---|
| 130 |         . S RXNFDA(176.003,"+"_I_",",2)=RCUI
 | 
|---|
| 131 |         . S RXNFDA(176.003,"+"_I_",",3)=VSAB
 | 
|---|
| 132 |         . S RXNFDA(176.003,"+"_I_",",4)=RSAB
 | 
|---|
| 133 |         . S RXNFDA(176.003,"+"_I_",",5)=SON
 | 
|---|
| 134 |         . S RXNFDA(176.003,"+"_I_",",6)=SF
 | 
|---|
| 135 |         . S RXNFDA(176.003,"+"_I_",",7)=SVER
 | 
|---|
| 136 |         . S RXNFDA(176.003,"+"_I_",",14)=SRL
 | 
|---|
| 137 |         . D UPDATE^DIE("","RXNFDA")
 | 
|---|
| 138 |         . I $D(^TMP("DIERR",$J)) U $P W "ERR" G EX
 | 
|---|
| 139 |         . ; Now, file WP field SCIT
 | 
|---|
| 140 |         . D WP^DIE(176.003,I_",",25,,$NA(SCIT))
 | 
|---|
| 141 | EX3     D CLOSE^%ZISH("FILE")
 | 
|---|
| 142 |         Q
 | 
|---|
| 143 |         
 | 
|---|