String Manipulation in Xlate

Clovertech Forums Read Only Archives Cloverleaf Cloverleaf String Manipulation in Xlate

  • Creator
    Topic
  • #49495
    Femina Jaffer
    Participant

      Hello,

      How does one go about removing unwanted characters from a string, using Xlates?

      For example, ORC 2 has “1234567-033”.  I want to just keep data before before the hyphen (“-“).  

      Therefore, copy the new output “1234567” to ORC 2.

      I have done this before, and now I am just blank.  I cannot get this to work anymore.

      Thanks again.

      fj

    Viewing 3 reply threads
    • Author
      Replies
      • #62223
        Robert Kersemakers
        Participant

          Hi Femina,

          I think a ‘split’ would be the easiest solution:

          Code:

          lassign $xlateInVals str
          set strlist [split $str “-“]
          set first [lindex $strlist 0]
          set xlateOutVals [list $first]


          This should give “1234567” as result.

          Zuyderland Medisch Centrum; Heerlen/Sittard; The Netherlands

        • #62224

          For testing in tcl (hcitcl) …

          Code:

          set string “1234567-033”
          regexp — {(d+)-d+} $string match string
          puts $string ;# returns “1234567”

          In the xlate …

          Code:

          regexp — {(d+)-d+} [lindex $xlateInVals 0] match newString; set xlateOutVals [list $newString]

          -- Max Drown (Infor)

        • #62225
          Russ Ross
          Participant

            We have a reusuable proc for splitting a field that I will share in case you find it of interest for what you are trying to do

            In this xlate snippet example I will split the input HL7 field in FT1-7 using the dash “-” to populae up to 5 separate output FRL fields.

            Here is a specific example:

            The HL7 message coming in has FT1-7 valued with

            5114-26-76^PROF

            so the outbound flat record layout will be valued as follows

            prs_cdm_procedure_code = 5114

            prs_modifier_1 = 26

            prs_modifier_2 = 76

            prs_modifier_3 = “filled with spaces as defined in FRL since nothing is available to be mapped”

            prs_modifier_4 = “filled with spaces as defined in FRL since nothing is avaialbe to be mapped”

            Here is the xlt_splitflds proc that will get called to do the work in the Xlate.

            Code:

            ################################################################################
            # Name: xlt_splitflds
            # Purpose: Provide a capability to split a field into it’s sub fields based
            #           upon a user specified separator.
            #
            #           For example a name field is comprised of three sub-fields:
            #              Last Name
            #              First Name
            #              Middle Initial
            #               separated by a comma thus LastName,FirstName,MiddleInitial
            #           After the proc has executed, three subfields will have been extracted.
            #
            #
            # UPoC type:    XLTP
            # Args: @xlt_splitflds_debug
            #           @xlt_splitflds_sep
            #           Field to be checked
            # Author:       Jim Kosloskey
            # Date-written: 10/01/1999
            # Purpose:      This procedure splits a Source field into at least as many fields as specified
            #               in the Destination (xlateOutList) as separated by the separator specified i
            #               (xlt_splitflds_sep).
            #
            #**************************************************************************************************************
            #*                                            C O D E   A U D I T                                                               *
            #*_____________________________________________________________________________*
            #*Date       I-Catcher  Description                                                                                          *
            #*———- ———- ———————————————–*
            #*10/01/1999            Procedure conception
            #*
            #*______________________________________________________________________________*
            #*02/24/2004 jrk02242004  Changed use of translit Tcl command to convert DEBUG
            #*                        argument to uppercase. Now using string toupper Tcl
            #*                        command as translit is being phased out of Tcl.
            #*_____________________________________________________________________________*
            #**************************************************************************************************************
            #
            ################################################################################
            #
            # Copyright: Copyright(c) 1999, Oakwood Healthcare System. All rights reserved.

            proc xlt_splitflds { } {
               upvar xlateId       xlateId
             xlateInList   xlateInList
             xlateInTypes  xlateInTypes
             xlateInVals   xlateInVals
             xlateOutList  xlateOutList
             xlateOutTypes xlateOutTypes
             xlateOutVals  xlateOutVals

            # Global variables
               global HciConnName           ;#Get the connection name

            # Local variables
                set fatal_err “N”
                set elem_count 0
                set field_count 1    
                set temp_outvals {}
                set module “$HciConnName XLT_SPLITFLDS v1.1:”
            #
            #******************************************************************************************************
            # Setup the field IDs necessary for this procedure
            #******************************************************************************************************
            #
               set splitflds_debug {@xlt_splitflds_debug}          ;# xlt_splitflds debug switch
               set splitflds_sep {@xlt_splitflds_sep}              ;# xlt_splitflds separator
            #
            #******************************************************************************************************
            # Setup the Indexes into the Inbound list for the above arguments
            #******************************************************************************************************
            #
               set debug_ndx {}                         ;# xlt_splitflds debug switch index
               set sep_ndx {}                           ;# xlt_splitflds separator index
            #
            #******************************************************************************************************
            # Setup the Storage Area for the above arguments
            #******************************************************************************************************
            #
               set debug {N}                             ;# debug switch
               set sep {}                                ;# sep
            #
            #******************************************************************************************************
            # Get the DEBUG argument
            #   Find the debug argument position if it exists in the inbound list
            #   If it does not exist, notify the invoker
            #   If it does exist, find the value of the switch
            #       Convert a lower case y to upper case
            #******************************************************************************************************
            #
               set debug_ndx [lsearch $xlateInList $splitflds_debug]
               if {$debug_ndx == -1} {                     ;# Did we find the argument?
                    if {$debug == “Y”} {          ;#Debug on?
                        echo “$module $splitflds_debug not located, assuming no debug.”
                    }
                }
            # jrk02242004 – old way using translit      
            #    set debug [translit y Y [lindex $xlateInVals $debug_ndx]]     ;#Change lower to upper  
            # jrk02242004 – new way using string toupper
                set debug [string toupper [lindex $xlateInVals $debug_ndx]]

            #If debug – display received arguments
                if {$debug == “Y”} {          ;#Debug on?
                    echo “$module @xlt_splitflds_debug is >$debug<."     } # #****************************************************************************************************** # Get the SEP argument #   Find the sep argument position if it exists in the inbound list #   If it does not exist, notify the invoker #   If it does exist, find the value of the argument #****************************************************************************************************** #    set sep_ndx [lsearch $xlateInList $splitflds_sep]    if {$sep_ndx == -1} {                     ;# Did we find the argument?        if {$debug == "Y"} {          ;#Debug on?            echo "$module $splitflds_sep not located, proc terminated - NO ACTION TAKEN."        }        xpmerror $xlateId action "$module: Action terminated."     } # # Show the separator argument index     if {$debug == "Y"} {          ;#Debug on?         echo "$module @xlt_splitflds_sep index is >$sep_ndx<."     } # #****************************************************************************************** #* Locate the first element which is NOT an argument #******************************************************************************************    foreach listval $xlateInList {     ;# Step through the xlateInList #    If the list element is one of the arguments #     then bump the list counter      if {[cequal $listval $splitflds_sep] || [cequal $listval $splitflds_debug]} {          incr elem_count 1      } else {                       ;# Found a non-argument element          set elem_ndx $elem_count   ;# set the index for the element          set elem_found 1           ;# set a switch to let everyone else know          if {$debug == "Y"} {       ;# If debug - do da debug dance              echo "$module: First non argument Source element named >$listval< located as element # $elem_count."          }                                  break   ;# Found a non-argument element - stop scanning      }   ;#endelse    }   ;#end foreach       #****************************************************************************************** #* Check to see if we located anything besides our arguments #* If no non-argument elemnts located, #*    - log the event #*    - kill the action #* If an element is located then use that for the substitution #******************************************************************************************    if {!$elem_found} {     ;#No non-argument elements located - Bad News!!        echo "$module: The only elements found in the Source are xlt_splitflds arguments."        echo "$module: Fatal errors occurred while getting arguments (see above)!"        echo "$module:                       NO ACTIVITY PERFORMED!!"        xpmerror $xlateId action "$module: Action terminated."    } else {        set field [lindex $xlateInVals $elem_ndx]    }   ;#endelse #Get the number of Destination fields     set num_flds [llength $xlateOutList] #Get the separator     set sep [lindex $xlateInVals $sep_ndx] #Split the Source field into sub fields based on the separator     set fields_lst [split $field $sep] # # Show the various arguments     if {$debug == "Y"} {          ;#Debug on?         echo "$module @xlt_splitflds_sep value is >$sep<."         echo "$module number of subfields expected (Destination list) value is >$num_flds<."         echo "$module Fields separated are: >$fields_lst<."         echo "$module Source field $listval value is >$field<."    } # #We need to null out the existing xlateOutVals entries in case #   there are less subfields than number of xlateOutVals so the #   COPY action does not erroneously populate xlateOutVals #     if {$debug == "Y"} {          ;#Debug on?         echo "$module -------- Nulling sub fields ---------"         echo "$module   OutVals prior to Null >$xlateOutVals<"         echo "$module   Nulling list elements 0 thru [expr $num_flds - 1]."     }     set xlateOutVals [lreplace $xlateOutVals 0 end ""]     if {$debug == "Y"} {          ;#Debug on?         echo "$module   OutVals after nulling >$xlateOutVals<"         echo "$module ------ End nulling sub fields -------"         echo "$module ------ Start Copying sub fields -------"     }     set field_count 1 #Place the subfields into the Destination fields     foreach sub_field $fields_lst {         if {[expr $field_count > $num_flds]} {
                        break
                    }
                    if {$debug == “Y”} {          ;#Debug on?
                        echo “$module Sub field $field_count >$sub_field< copied to [lindex $xlateOutList [expr $field_count - 1]]."         }         xpmstore $xlateId [lindex $xlateOutList [expr $field_count - 1]] c $sub_field         incr field_count 1     }     if {$debug == "Y"} {          ;#Debug on?         echo "$module ------ End Copying sub fields -------"     } }

            Attahced are snippet screen shots to illustrate the details of how to configure the xlate to call the xlt_splitflds proc:

            Russ Ross
            RussRoss318@gmail.com

          • #62226
            Femina Jaffer
            Participant

              Thank you all for all your responses.  I was able to solve this at the end.

              Thanks again!

              Femina

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