changine case

  • Creator
    Topic
  • #51146
    Kevin Crist
    Participant

    Our HIS system sends out all caps for name, address and other things. We are integrating  now with a system from our facility and they have 2 years worth of data that they have first letter capitalized the lower for the rest. When we send over a transaction with all caps it makes a new patient. has anyone come across this before. Will it take one big tclproc or possible in an xlate?

    thanks for your thoughts and comments

Viewing 14 reply threads
  • Author
    Replies
    • #68934
      Vince Angulo
      Participant

      If it was just a few fields the following tcl fragment would work in the xlate:

      set xlateOutVals [string toupper $xlateInVals]

      But, if you’re doing wholesale replacement across entire segments or messages applying the string toupper command would be more efficient in a pre-processing UPoC.

      Hope this helps.

    • #68935
      Kevin Crist
      Participant

      yeah, its kind of a wholesale thing from what i gather…ie

      we are sending DOE^SMITH^Z  and need it changed to Doe^Smith^Z.

      Address being sent is 210 OAK STREET^CRAZYTOWN^IN and they need 210 Oak Street^Crazytown^IN.  Plus insurance names, and any next of kin names.

    • #68936
      James Cobane
      Participant

      Kevin,

      Do you need to convert the data to all UPPER or convert it from all UPPER to mixed-case (i.e. Smith vs. SMITH)?  If you need to convert to all UPPER then the command Vince shows will do the trick.  If you need to convert to mixed case, there is a similar ‘string’ command:

          string totitle $LastName

      But, you would need to perform this on each name element individually (i.e. First, Last, etc.).

      Hope this helps.

      Jim Cobane

      Henry Ford Health

    • #68937
      Kevin Crist
      Participant

      yes i am going from all UPPER to mixed case. In many fields. thanks for the comments

    • #68938
      Charlie Bursell
      Participant

      If you use string totitle don’t forget to check names with more than one word.

      For example what would you do with a last name like “Van Horn”

      It is never easy, that’s why you get the big bucks  😉

    • #68939
      Tom Rioux
      Participant

      Here is one possible solution:

      For names:

      hcitcl>set name “VAN HORN”

      hcitcl>foreach nn [split $name] { lappend newname [string totitle $nn] }

      hcitcl>echo $newname

      Van Horn

      or for addresses:

      hcitcl>set address “1234 WHISPERING WIND DRIVE”

      hcitcl>foreach addy [split $address] { lappend naddy [string totitle $addy] }

      hcitcl>echo $naddy

      1234 Whispering Wind Drive

      Surely it can’t be that simple.  I must be missing something or left out some possibilities.

      Tom

    • #68940
      Jim Kosloskey
      Participant

      Hyphenated names, names like McKinley… 🙁

      email: jim.kosloskey@jim-kosloskey.com 29+ years Cloverleaf, 59 years IT - old fart.

    • #68941
      Kevin Crist
      Participant

      Thank you all for your comments. This should be a fun one to do.

    • #68942
      Tom Rioux
      Participant

      I guess here it would be best to go with percentages.   There is no way to account for EVERY possibility and you will have to realize that there may be some manual cleanup that has to be done on the back end of this whole process.  

      The hyphenated can probably easily be accounted for with an extra command or two in the loop.  However, the “McKinley” or something like it is a whole different story.  There could be many variations like “McKinley” or “MacGyver”.  Is there a sure fire way to account for every variation and know which letter needs to be capitalized and which ones doesnt? (Charlie??  🙂 ) Then again, what if you get someone who spells their name like “e. e. white” who never used capitilization in their name.  (Ok, Ok, I’m going a little overboard with that one but you get my point… 😀 )

      Guess it is safe to go with what will work for the majority of the names or words and not run the risk of creating further errors.   I don’t know about you but I’ve been having fun with this one!!!  

      Tom

    • #68943
      Jim Kosloskey
      Participant

      This is just me musing out loud but,

      Aren’t you at all concerned that the system is using the Patient Name for Identification?

      I mean, after all, that field is subject many errors in a normal situation.

      Maybe suggest they modify their matching routine to internally change both to the samecase (upper or lower), do the compare and only add a new patient if that mismatches.

      Even then, I bet there will be pletny of mis-matches on the same patient because the two systems do not match regardless of case considerations.

      email: jim.kosloskey@jim-kosloskey.com 29+ years Cloverleaf, 59 years IT - old fart.

    • #68944
      Kevin Crist
      Participant

      yes. this is an ancillary application that they have been using for a couple of years and they have always handtyped the name in like that, we are now interfacing with them so they dont have to use that , but they do match on name because they have never recieved our medical record number to match on. thats how we found this big mess. We are hoping the vendor can do some type of conversion for us but i am exploring the possibilities just in case, because if they do that i am sure it wont be cheap.

    • #68945
      Tom Rioux
      Participant

      One possible solution to the hyphen.  I think this would cover it…correct me if I’m wrong Jim and Charlie.   It may not be the most elegant of solutions……

      hcitcl>set full “KEITH VAN-HORN”

      #Initialize your “newfull” variable

      hcitcl>set newfull “”

      # Now run the foreach

      hcitcl>foreach name [split $full] {

           foreach part [split $name -] {

             lappend tmp [string totitle $part]

           }

           set newname [join $tmp -]

           lappend newfull $newname

           set tmp “”

      }

      hcitcl>echo $newfull

      Keith Van-Horn

    • #68946
      Kevin Crist
      Participant

      Finally got some time to work on this. I seem to be getting the totitle to work kinda, it will lowercase everything except first letter of name, but it doesnt capitalize the first letter of the first name. I thought i was on the right track with this but need some more guidance, also am i returning the changed name correctly to the message? Thanks very much for any ideas.

      ###############################################################################

      ###############################################################################

      ###############################################################################

      # Name: tpsAlls_Formatting

      # Purpose: This tclproc formats the case of the names, addresses, Insurances

      #           for Allscripts. Example…DOE,JOHN ->Doe,John.

      #          The patient/relative fields are listed below:

      # PID-5: Patient Name

      # PID-9: Patient Alias

      # NK1-2: Name

      # GT1-3: Guarantor Name

      # GT1-4: Guarantor Spouse Name

      # IN1-16: Name of Insured

      #

      #

      #

      #

      #

      #

      # UPoC type: tps

      # Args: tps keyedlist containing the following keys:

      #       MODE    run mode (“start”, “run” or “time”)

      #       MSGID   message handle

      #       ARGS    user-supplied arguments:

      #              

      #

      # Returns: tps disposition list:

      #          Continues the modified messages

      # OR

      # Continues un-modified message if the segment is missing

      #

      # Created: Kevin Crist

      #

      proc FormatAllsName { NameFldList subSep } {

         set i 0

         foreach Name $NameFldList {

         set subfldList [split $Name $subSep]

         lset subfldList [string totitle $Name ]

         lset NameFldList [join $subfldList $subSep]

      incr i

         

      echo Name:$Name

      echo subfldList:$subfldList

      echo NameFldList:$NameFldList

      }

        return $NameFldList

      }

      proc tpsAlls_Formatting { args } {

       

       

      ###############################################################################

      ###############################################################################

      # #

      # Get the Connection/Proc Name for the Error/Debug Messages   #

      ###############################################################################

      ###############################################################################

       

        global HciConnName

        set myname “$HciConnName/[lindex [info level 1] 0]”

        set nowis [clock format [clock scan now] -format “%D – %T”]

       

      ###############################################################################

      ###############################################################################

      # #

      # Initialize variables used #

      ###############################################################################

      ###############################################################################

         

         set dispList {} ;# Disposition List Returned to Engine

         set fldSep “” ;# Field Seperator – get from MSH

         set subSep “” ;# SubField Seperator – get from MSH

         set repSep “” ;# Repeating Field Seperator – get

          ;#     from the MSH

         set segList

    • ;# Message Segments in a list

         set fldList

    • ;# Fields of a segment in list

         set repList

    • ;# The Repitions of the Field in list

         set subfldList

    • ;# Sub-Fields of a Field in list  

         

         set PIDpos -1 ;# Position of PID segment in msg

         set NK1pos -1 ;# Position of NK1 segment in msg

         set GT1pos -1 ;# Position of GT1 segment in msg

         set IN1pos -1 ;# Position of IN1 segment in msg

         

         set PatName 5 ;# Position of Patient Name

         set PatAlias 9 ;# Position of Patinet Alias

         set NOKName 2 ;# Position of Next of Kin Name

         set GT1Name 3    ;# Guarantor Name

         set GT1SpName 4 ;# Guarantor Spouse Name

         set IN1Name 16 ;# Name of Insured

         

         set PosList

    • ;# List of Position of Segments in msg

         

      ###############################################################################

      ###############################################################################

      # #

      # Load in the arguments we need that were passed from the caller #

      ###############################################################################

      ###############################################################################    

         

       keylget args MODE mode                ;# The mode the engine was called from

       

      ###############################################################################

      ###############################################################################

      # #

      # Switch based on what mode the engine was in when it called the procedure #

      ###############################################################################

      ###############################################################################  

       

        switch -exact — $mode {

             start { }

                 

             run {

               set mh [keylget args MSGID] ;# Get message handle from args

         

               set dispList

        ;# Initialize to good message

                 set msg [msgget $mh] ;# Get a copy of the message

                 

                 set fldSep [string index $msg 3] ;# Field Seperator  

           set subSep [string index $msg 4] ;# Sub-Field Seperator

                 set repSep [string index $msg 5] ;# Field Seperator

         

                 set segList [split $msg r]      ;# Split message into segList

         

        ###############################################################################

        ###############################################################################

        # #

        # Find Position of Segments that contain Name Positions #

        ###############################################################################

        ###############################################################################

         

                 lappend PosList [lsearch -regexp $segList {^PID}]

               lappend PosList [lsearch -regexp $segList {^NK1}]

                 lappend PosList [lsearch -regexp $segList {^GT1}]

                 lappend PosList [lsearch -regexp $segList {^IN1}]

        ###############################################################################

        ###############################################################################

        # #

        # Process each segment that might contain a Dr ID Numbers #

        ###############################################################################

        ###############################################################################

                 

                 foreach segPos $PosList {

                   if { $segPos > 0} {

                   

                   set fldList [split [lindex $segList $segPos] $fldSep]

                   

        ###############################################################################

        ###############################################################################

        # #

        #  For each of the possible Name fields do the same thing   #

        #     1) Any of the fields can have repetitions #

        #        Split the field into a list of each repition. #

        #     2) Call the subroutine that changes the first letter of each  #

        #        name to a captial and lowercase the rest  #

        #     3) Rebuild the segList with the newly formatted names #

        ###############################################################################

        ###############################################################################          

                   

               

               switch -exact [lindex $fldList 0] {

                 PID {

                   if { [llength $fldList] >= [expr $PatName + 1] } {

                   set repList [split [lindex $fldList $PatName] $repSep]

                   set repList [FormatAllsName $repList $subSep]

                   }

                   lset fldList $PatName [join $fldList $fldSep]

               }

         

               

               

               

               

               }

               

                   }

                 }

             

        #           lappend dispList “CONTINUE $mh”

               }

               time {

                   # Timer-based processing

           # N.B.: there may or may not be a MSGID key in args

               }

               

               shutdown {

           # Doing some clean-up work

        }

           }

           return $dispList

        }

  • #68947
    Bob Richardson
    Participant

    Greetings,

    Not familiar with the ins and outs of the “lset” command but it looks like the lset is only modifying the first element in your names list.  Here is an alternate coding strategy to consider:  for example:

    tcl>set name “BOB^RICHARDSON”

    BOB^RICHARDSON

    tcl>set names [split $name ^]

    BOB RICHARDSON

    tcl>foreach name $names {

    lappend newnames [string totitle $name]

    }

    tcl>echo $newnames

    Bob Richardson

    tcl>

    tcl>set newnames [join $newnames ^]

    Bob^Richardson

    tcl>echo $newnames

    Bob^Richardson

    Good hunting !

  • #68948

    I would suggest working with the database team of the receiving application to try to do one of two things:

    1) Do not match on patient name, but instead match on a unique number such as MRN or a combination of unique numbers such as MRN and DOB or some such. Or at the very least, make the patient name matching case insensitive.

    2) Convert all of the names in the database to uppercase. There’s just so many things that go wrong with the camel back case conversion you are attempting.

    -- Max Drown (Infor)

  • Viewing 14 reply threads
    • The forum ‘Cloverleaf’ is closed to new topics and replies.

    Forums

    Forum Statistics

    Registered Users
    5,115
    Forums
    28
    Topics
    9,290
    Replies
    34,422
    Topic Tags
    286
    Empty Topic Tags
    10