[613] | 1 | XLFNAME ;CIOFO-SF/TKW,MKO-Utilities for person name fields ;10:12 AM 29 Jan 2003
|
---|
| 2 | ;;8.0;KERNEL;**134,211,240**;Jul 10, 1995
|
---|
| 3 | ;
|
---|
| 4 | STDNAME(XUNAME,XUFLAG,XUAUD) ;Standardize name XUNAME
|
---|
| 5 | ; XUNAME - In, name to be standardized. Out, standardized name
|
---|
| 6 | ; XUFLAG - In, "C" : return components in XUNAME array
|
---|
| 7 | ; "F" : Assume input is in general form
|
---|
| 8 | ; Family,Given Middle Suffix
|
---|
| 9 | ; "G" : Don't return XUAUD("GIVEN")
|
---|
| 10 | ; "P" : Remove parenthetical text
|
---|
| 11 | ;.XUAUD - Out:
|
---|
| 12 | ; XUAUD = original name passed in
|
---|
| 13 | ; XUAUD(subsc)="" if problems
|
---|
| 14 | ;
|
---|
| 15 | N I,XUFAM,XUNM,XUOUT,XUMOV,XUREST,XUSP
|
---|
| 16 | S XUOUT=$G(XUFLAG)["C"
|
---|
| 17 | N:XUOUT XUFAMO,XURESTO
|
---|
| 18 | K XUAUD S XUAUD=XUNAME
|
---|
| 19 | ;
|
---|
| 20 | F I="FAMILY","GIVEN","MIDDLE","SUFFIX" S XUNM(I)="" S:XUOUT XUOUT(I)=""
|
---|
| 21 | S:XUNAME?.E1" TEST" XUNAME=$E(XUNAME,1,$L(XUNAME)-5)
|
---|
| 22 | ;
|
---|
| 23 | I $G(XUFLAG)["P",XUNAME?.E1(1"(",1"[",1"{").E D
|
---|
| 24 | . S XUNAME=$$PARENS^XLFNAME1(XUNAME)
|
---|
| 25 | . S:XUAUD'=XUNAME XUAUD("STRIP")=""
|
---|
| 26 | ;
|
---|
| 27 | S:XUNAME?1"EEE".E!(XUNAME?.E1" FEE")!(XUNAME?1A1"-".E) XUAUD("NOTE")=""
|
---|
| 28 | ;
|
---|
| 29 | ;If no comma, assume given name first
|
---|
| 30 | I XUNAME'[",",$G(XUFLAG)'["F" G GIVFRST
|
---|
| 31 | ;
|
---|
| 32 | ;Standardize Family
|
---|
| 33 | ;(don't remove internal spaces or convert suffixes yet)
|
---|
| 34 | I $E(XUNAME,1,3)="ST." S XUAUD("FAMILY")=""
|
---|
| 35 | S XUFAM=$$CLEANC^XLFNAME1($P(XUNAME,","),"FI",.XUAUD)
|
---|
| 36 | S XUFAM=$$PUNC(XUFAM,.XUAUD)
|
---|
| 37 | D:XUOUT
|
---|
| 38 | . S XUFAMO=$$CLEANC^XLFNAME1($P(XUNAME,","),"FO",.XUAUD)
|
---|
| 39 | . S XUFAMO=$$PUNC(XUFAMO,.XUAUD)
|
---|
| 40 | ;
|
---|
| 41 | ;Look for suffixes at end of Family
|
---|
| 42 | D SUFEND^XLFNAME1(.XUFAM,.XUFAMO,.XUNM,.XUOUT,.XUAUD)
|
---|
| 43 | S:XUNM("SUFFIX")]"" XUAUD("SUFFIX")=""
|
---|
| 44 | S XUNM("FAMILY")=XUFAM S:XUOUT XUOUT("FAMILY")=XUFAMO
|
---|
| 45 | ;
|
---|
| 46 | ;Parse rest of name
|
---|
| 47 | S XUREST=$P(XUNAME,",",2,999)
|
---|
| 48 | S XUSP=XUREST?1" "1.E
|
---|
| 49 | D:XUOUT
|
---|
| 50 | . S XURESTO=$$CLEANC^XLFNAME1(XUREST,"O",.XUAUD)
|
---|
| 51 | . S XURESTO=$$PUNC(XUREST,.XUAUD)
|
---|
| 52 | S XUREST=$$CLEANC^XLFNAME1(XUREST,"I",.XUAUD)
|
---|
| 53 | S XUREST=$$PUNC(XUREST,.XUAUD)
|
---|
| 54 | D MOVSUF(.XUREST,.XUOUT,.XURESTO,.XUAUD,.XUMOV)
|
---|
| 55 | D N2(XUREST,.XUNM,.XUOUT,$G(XURESTO),.XUAUD)
|
---|
| 56 | ;
|
---|
| 57 | ;Account for names that look like only Family and Suffix(es)
|
---|
| 58 | I XUNM("MIDDLE")="",$$CHKSUF^XLFNAME1(XUNM("GIVEN"))]"" D
|
---|
| 59 | . N XUCNT,XUSUF1,XUSUF2
|
---|
| 60 | . I 'XUSP Q:$E(XUNM("GIVEN"))'?1N
|
---|
| 61 | . S XUCNT=$L(XUNM("SUFFIX")," ")
|
---|
| 62 | . S XUSUF1=$P(XUNM("SUFFIX")," ",XUCNT-XUMOV+1,XUCNT)
|
---|
| 63 | . S XUSUF2=$P(XUNM("SUFFIX")," ",1,XUCNT-XUMOV)
|
---|
| 64 | . S XUNM("SUFFIX")=$$JOIN($$JOIN(XUSUF1,$$ROMAN^XLFNAME1(XUNM("GIVEN"))),XUSUF2)
|
---|
| 65 | . S XUNM("GIVEN")=""
|
---|
| 66 | . D:XUOUT
|
---|
| 67 | .. S XUSUF1=$P(XUOUT("SUFFIX")," ",XUCNT-XUMOV+1,XUCNT)
|
---|
| 68 | .. S XUSUF2=$P(XUOUT("SUFFIX")," ",1,XUCNT-XUMOV)
|
---|
| 69 | .. S XUOUT("SUFFIX")=$$JOIN($$JOIN(XUSUF1,XUOUT("GIVEN")),XUSUF2)
|
---|
| 70 | .. S XUOUT("GIVEN")=""
|
---|
| 71 | ;
|
---|
| 72 | D BLDSTD(.XUNAME,.XUNM,.XUOUT,.XUAUD)
|
---|
| 73 | K:$G(XUFLAG)["G" XUAUD("GIVEN")
|
---|
| 74 | Q
|
---|
| 75 | ;
|
---|
| 76 | BLDSTD(XUNAME,XUNM,XUOUT,XUAUD) ;Build standard name in XUNAME
|
---|
| 77 | ;Put components in XUNAME array
|
---|
| 78 | N I,J
|
---|
| 79 | K XUNAME M:XUOUT XUNAME=XUOUT
|
---|
| 80 | ;
|
---|
| 81 | S XUNAME=XUNM("FAMILY")_","
|
---|
| 82 | S:XUNAME[" " XUNAME=$TR(XUNAME," "),XUAUD("SPACE")=""
|
---|
| 83 | ;
|
---|
| 84 | I XUNM("GIVEN")]"" S XUNAME=XUNAME_XUNM("GIVEN")
|
---|
| 85 | E S XUAUD("GIVEN")=""
|
---|
| 86 | S:XUNM("MIDDLE")]"" XUNAME=XUNAME_" "_XUNM("MIDDLE")
|
---|
| 87 | S:XUNM("SUFFIX")]"" XUNAME=XUNAME_" "_XUNM("SUFFIX")
|
---|
| 88 | S:XUNAME?.E1"," XUNAME=$E(XUNAME,1,$L(XUNAME)-1)
|
---|
| 89 | S:XUNAME?.E1N.E XUAUD("NUMBER")=""
|
---|
| 90 | ;
|
---|
| 91 | ;Remove spaces after periods, and ~ and ^, in name components
|
---|
| 92 | I XUOUT S I="" F S I=$O(XUNAME(I)) Q:I="" D
|
---|
| 93 | . S XUNAME(I)=$TR(XUNAME(I),"`^") Q:XUNAME(I)'[". "
|
---|
| 94 | . N J S J=0 F S J=$F(XUNAME(I),". ",J) Q:'J S $E(XUNAME(I),J-1)=""
|
---|
| 95 | Q
|
---|
| 96 | ;
|
---|
| 97 | GIVFRST ;Come here if name has no comma.
|
---|
| 98 | N XUCNT,XUNAM,XUNAMO
|
---|
| 99 | ;
|
---|
| 100 | ;Do initial standardizing
|
---|
| 101 | S XUNAM=$$CLEANC^XLFNAME1(XUNAME,"I",.XUAUD)
|
---|
| 102 | S XUNAM=$$PUNC(XUNAME,.XUAUD)
|
---|
| 103 | D:XUOUT
|
---|
| 104 | . S XUNAMO=$$CLEANC^XLFNAME1(XUNAME,"O",.XUAUD)
|
---|
| 105 | . S XUNAMO=$$PUNC(XUNAMO,.XUAUD)
|
---|
| 106 | ;
|
---|
| 107 | ;Look for suffixes at end
|
---|
| 108 | D SUFEND^XLFNAME1(.XUNAM,.XUNAMO,.XUNM,.XUOUT,.XUAUD)
|
---|
| 109 | S XUCNT=$L(XUNAM," ")
|
---|
| 110 | ;
|
---|
| 111 | ;If name contains only suffixes, make first suffix the Family Name
|
---|
| 112 | I XUCNT=0 D Q
|
---|
| 113 | . S XUNM("FAMILY")=$P(XUNM("SUFFIX")," ")
|
---|
| 114 | . S XUNM("SUFFIX")=$P(XUNM("SUFFIX")," ",2,999)
|
---|
| 115 | . S:$G(XUFLAG)'["G" XUAUD("GIVEN")=""
|
---|
| 116 | . D:XUOUT
|
---|
| 117 | .. S XUOUT("FAMILY")=$P(XUOUT("SUFFIX")," ")
|
---|
| 118 | .. S XUOUT("SUFFIX")=$P(XUOUT("SUFFIX")," ",2,999)
|
---|
| 119 | . D BLDSTD(.XUNAME,.XUNM,.XUOUT,.XUAUD)
|
---|
| 120 | ;
|
---|
| 121 | ;Set Family and rest of name
|
---|
| 122 | S XUNM("FAMILY")=$P(XUNAM," ",XUCNT),XUREST=$P(XUNAM," ",1,XUCNT-1)
|
---|
| 123 | S:XUOUT XUOUT("FAMILY")=$P(XUNAMO," ",XUCNT),XURESTO=$P(XUNAMO," ",1,XUCNT-1)
|
---|
| 124 | ;
|
---|
| 125 | ;Process rest of name (don't look for suffixes)
|
---|
| 126 | D N2(XUREST,.XUNM,.XUOUT,$G(XURESTO),.XUAUD,"s")
|
---|
| 127 | D BLDSTD(.XUNAME,.XUNM,.XUOUT,.XUAUD)
|
---|
| 128 | K:$G(XUFLAG)["G" XUAUD("GIVEN")
|
---|
| 129 | Q
|
---|
| 130 | ;
|
---|
| 131 | NAMECOMP(XUNM) ;Build components from standard name
|
---|
| 132 | S XUNM("FAMILY")=$P(XUNM,",")
|
---|
| 133 | D N2($P(XUNM,",",2,999),.XUNM)
|
---|
| 134 | S XUNM("MIDDLE")=$G(XUNM("MIDDLE"))
|
---|
| 135 | S XUNM("SUFFIX")=$G(XUNM("SUFFIX"))
|
---|
| 136 | Q
|
---|
| 137 | ;
|
---|
| 138 | MOVSUF(XUREST,XUOUT,XURESTO,XUAUD,XUMOV) ;Move suffixes immediately in front to the end
|
---|
| 139 | N XUI,XUCNT
|
---|
| 140 | S XUCNT=$L(XUREST," "),XUMOV=0
|
---|
| 141 | F XUI=1:1:XUCNT I $$CHKSUF1^XLFNAME1($P(XUREST," ",XUI))="" S XUI=XUI-1 Q
|
---|
| 142 | I XUI,XUI<XUCNT D
|
---|
| 143 | . S XUMOV=XUI
|
---|
| 144 | . S XUREST=$P(XUREST," ",XUI+1,999)_" "_$P(XUREST," ",1,XUI)
|
---|
| 145 | . S:XUOUT XURESTO=$P(XURESTO," ",XUI+1,999)_" "_$P(XURESTO," ",1,XUI)
|
---|
| 146 | . S XUAUD("SUFFIX")=""
|
---|
| 147 | Q
|
---|
| 148 | ;
|
---|
| 149 | PUNC(XUNAME,XUAUD) ;Remove name pieces that are purely punctuation
|
---|
| 150 | N XUC,XUI,XUNEW
|
---|
| 151 | S XUNEW=""
|
---|
| 152 | F XUI=1:1:$L(XUNAME," ") D
|
---|
| 153 | . S XUC=$P(XUNAME," ",XUI)
|
---|
| 154 | . I XUC?1.P S:XUC'?1."." XUAUD("PUNC")="" Q
|
---|
| 155 | . S XUNEW=$$JOIN(XUNEW,XUC)
|
---|
| 156 | Q XUNEW
|
---|
| 157 | ;
|
---|
| 158 | N2(XUREST,XUNM,XUOUT,XURESTO,XUAUD,XUFLAG) ;Build components from non-family name
|
---|
| 159 | N XUCNT,XUGIVEN,XUI,XUMIDDLE,XUSUF,XUSUFFIX,XUX,X
|
---|
| 160 | S XUOUT=$G(XUOUT) N:XUOUT XUGIVENO,XUMIDO,XUSUFO,XUXO
|
---|
| 161 | S XUCNT=$L(XUREST," ")
|
---|
| 162 | ;
|
---|
| 163 | ;Get Given from 1st space-piece, quit if only name
|
---|
| 164 | S XUNM("GIVEN")=$P(XUREST," ") S:XUOUT XUOUT("GIVEN")=$P(XURESTO," ")
|
---|
| 165 | Q:XUCNT<2
|
---|
| 166 | ;
|
---|
| 167 | S (XUSUF,XUMIDDLE,XUGIVEN)="" S:XUOUT (XUSUFO,XUMIDO,XUGIVENO)=""
|
---|
| 168 | ;
|
---|
| 169 | F XUI=XUCNT:-1:2 D
|
---|
| 170 | . S XUX=$P(XUREST," ",XUI)
|
---|
| 171 | . S:XUOUT XUXO=$P(XURESTO," ",XUI)
|
---|
| 172 | . ;
|
---|
| 173 | . ;If no middle yet, check for suffix
|
---|
| 174 | . I XUMIDDLE="",$G(XUFLAG)'["s" D Q:XUSUFFIX]""
|
---|
| 175 | .. S XUSUFFIX=""
|
---|
| 176 | .. I XUI=2,"I^V^X"[XUX S XUAUD("SUFFIX")="" Q
|
---|
| 177 | .. I XUI>2,XUX="D",$P(XUREST," ",XUI-1)="M" S XUAUD("SUFFIX")="" Q
|
---|
| 178 | .. S XUSUFFIX=$$CHKSUF^XLFNAME1(XUX) Q:XUSUFFIX=""
|
---|
| 179 | .. S X=XUSUFFIX,XUSUFFIX=$$ROMAN^XLFNAME1(XUSUFFIX)
|
---|
| 180 | .. I XUI=2,X=XUSUFFIX S XUAUD("SUFFIX")=""
|
---|
| 181 | .. S XUSUF=$$JOIN(XUSUFFIX,XUSUF)
|
---|
| 182 | .. S:XUOUT XUSUFO=$$JOIN(XUXO,XUSUFO)
|
---|
| 183 | . ;
|
---|
| 184 | . ;If not suffix, and no middle, set middle
|
---|
| 185 | . I XUMIDDLE="" S XUMIDDLE=XUX S:XUOUT XUMIDO=XUXO Q
|
---|
| 186 | . ;
|
---|
| 187 | . ;Otherwise, put in Given
|
---|
| 188 | . S:XUI=2 XUAUD("MIDDLE")=""
|
---|
| 189 | . S XUGIVEN=$$JOIN(XUX,XUGIVEN)
|
---|
| 190 | . S:XUOUT XUGIVENO=$$JOIN(XUXO,XUGIVENO)
|
---|
| 191 | ;
|
---|
| 192 | D:XUSUF]""
|
---|
| 193 | . S XUNM("SUFFIX")=$$JOIN($G(XUNM("SUFFIX")),XUSUF)
|
---|
| 194 | . S:XUOUT XUOUT("SUFFIX")=$$JOIN($G(XUOUT("SUFFIX")),XUSUFO)
|
---|
| 195 | ;
|
---|
| 196 | S XUNM("MIDDLE")=XUMIDDLE
|
---|
| 197 | S:XUOUT XUOUT("MIDDLE")=XUMIDO
|
---|
| 198 | D:"^NMI^NMN^"[(U_XUNM("MIDDLE")_U)
|
---|
| 199 | . S XUNM("MIDDLE")="" S:XUOUT XUOUT("MIDDLE")=""
|
---|
| 200 | . S XUAUD("NM")=""
|
---|
| 201 | ;
|
---|
| 202 | D:XUGIVEN]""
|
---|
| 203 | . S XUNM("GIVEN")=XUNM("GIVEN")_" "_XUGIVEN
|
---|
| 204 | . S:XUOUT XUOUT("GIVEN")=XUOUT("GIVEN")_" "_XUGIVENO
|
---|
| 205 | Q
|
---|
| 206 | ;
|
---|
| 207 | JOIN(S1,S2) ;Return S1 joined with S2 (separate by a space)
|
---|
| 208 | Q $G(S1)_$E(" ",$G(S1)]""&($G(S2)]""))_$G(S2)
|
---|
| 209 | ;
|
---|
| 210 | NAMEFMT(XUNAME,XUFMT,XUFLAG,XUDLM) ;Name formatting routine
|
---|
| 211 | G NAMEFMTX^XLFNAME1
|
---|
| 212 | ;
|
---|
| 213 | CLEANC(XUPART,XUFLAG,XUAUD) ;Component standardization
|
---|
| 214 | G CLEANCX^XLFNAME1
|
---|
| 215 | ;
|
---|
| 216 | BLDNAME(XUNC,XUMAX) ;Build standard name from components
|
---|
| 217 | Q $$NAMEFMT(.XUNC,"F","CSL"_+$G(XUMAX))
|
---|
| 218 | ;
|
---|
| 219 | HLNAME(XUNAME,XUFLAG,XUDLM) ;Convert name to HL7 format
|
---|
| 220 | N XUF
|
---|
| 221 | S XUF=$E("S",$G(XUFLAG)["S")
|
---|
| 222 | S:$G(XUFLAG)["L" XUF=XUF_"L"_+$P(XUFLAG,"L",2)
|
---|
| 223 | Q $$NAMEFMT^XLFNAME(.XUNAME,"H",XUF,$G(XUDLM))
|
---|
| 224 | ;
|
---|
| 225 | FMNAME(XUNAME,XUFLAG,XUDLM) ;Convert HL7 name string to standard name or name components
|
---|
| 226 | G F^XLFNAME6
|
---|
| 227 | ;
|
---|
| 228 | PRE ;Pre-install for patch XU*8.0*134
|
---|
| 229 | G PRE^XLFNAME3
|
---|
| 230 | ;
|
---|
| 231 | POST ;Post-install for XU*8.0*134 (conversion)
|
---|
| 232 | G POST^XLFNAME3
|
---|
| 233 | ;
|
---|
| 234 | GENERATE ;Generate information in ^XTMP about changes that will take
|
---|
| 235 | ;place when CONVERT^XLFNAME is run
|
---|
| 236 | G GENERATE^XLFNAME5
|
---|
| 237 | ;
|
---|
| 238 | PRINT ;Print the information in ^XTMP
|
---|
| 239 | G PRINT^XLFNAME4
|
---|
| 240 | ;
|
---|
| 241 | CONVERT ;Convert the Names in the New Person file
|
---|
| 242 | G CONVERT^XLFNAME5
|
---|