string match

  • Creator
    Topic
  • #51901
    Jason Bond
    Participant

    I have a proc I’m calling within a copy command in a XLT.  The proc searches the field specified in the copy command for the word “Procedure:”, and returns a “1” if it finds it.  I’m using this in a repeating OBX segment.  It works fine the way it is, what I need though is to be able to specify more than one value or string to search for.  In other words, I want it to search for, in this example, the word “Procedure:” or the word “Left”, and so on.  I’m copying the proc below, it’s a very simple string match proc.

    thank you all,

    Jason

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

    # Name: cpacs_string_reports

    # Purpose:

    # UPoC type: xltp

    # Args: none

    # Notes: All data is presented through special variables.  The initial

    # upvar in this proc provides access to the required variables.

    #

    # This proc style only works when called from a code fragment

    # within an XLT.

    #

    proc cpacs_string_reports {} {

       upvar xlateId       xlateId

     xlateInList   xlateInList

     xlateInTypes  xlateInTypes

     xlateInVals   xlateInVals

     xlateOutList  xlateOutList

     xlateOutTypes xlateOutTypes

     xlateOutVals  xlateOutVals

    set xlateOutVals [string match “*Procedure*” $xlateInVals]

    echo in $xlateInVals

    echo out $xlateOutVals

    }

Viewing 14 reply threads
  • Author
    Replies
    • #72183
      David Barr
      Participant

      Code:

      set matched 0
      foreach pattern { “*Procedure*” “*Left*” } {
       if { [string match $pattern [lindex $xlateInVals 0]] } {
         set matched 1
       }
      }
      set xlateOutVals [list $matched]

      A better way to do it might be to use regexp and specify a search pattern like “Procedure|Left”.

    • #72184
      Jason Bond
      Participant

      that still returns a “1” for Procedure and nothing for Left.  My problem is getting multiple values in the code, it will search for the first value but never for the second one.  I appreciate greatly any help on this.

    • #72185
      Robert Kersemakers
      Participant

      Hmmm. It should have worked. Make sure you treat xlateInVals as a list! I thinks that’s the problem.

      You can also use regexp:

      Code:

      set xlateOutVals [regexp {Procedure|Left} [lindex $xlateInVals 0]]

      Zuyderland Medisch Centrum; Heerlen/Sittard; The Netherlands

    • #72186
      Jim Kosloskey
      Participant

      Jason,

      Show us the data item you are searching against.

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

    • #72187
      Jason Bond
      Participant

      this is a part of the message format.  I’m looking at OBX-5.  When certain words are found the proc returns a “1”, then I have IF logic that alters that field to send BOLD code for the word to our HIS.  I want to be able to specify multiple words to search for.  Being that it’s an iteration it isn’t searching for more than the first value.  I know I have the syntax wrong to put multiple search values in the code.

      OBX|1|TX|DefaultObservationID|1|||||||F

      OBX|2|TX|DefaultObservationID|1|                Good Samaritan Regional Medical Center||||||F

      OBX|3|TX|DefaultObservationID|1|                         3600 NW Samaritan Dr||||||F

      OBX|4|TX|DefaultObservationID|1|                          Corvallis, OR 97330||||||F

      OBX|5|TX|DefaultObservationID|1|                             541-768-5111||||||F

      OBX|6|TX|DefaultObservationID|1|                  Transthoracic Echocardiogram Report||||||F

      OBX|7|TX|DefaultObservationID|1|Name: TEST, GSR233                            DOB: 02/23/1957||||||F

      OBX|8|TX|DefaultObservationID|1|Facility MRN: MG00000158                      Age: 53 yrs||||||F

      OBX|9|TX|DefaultObservationID|1|Study Date: 07/20/2010                        Gender: Female||||||F

      OBX|10|TX|DefaultObservationID|1|Pt. Location: GED                             Height: 70 in||||||F

      OBX|11|TX|DefaultObservationID|1|Ordering Physician: Dale, P                   Weight: 185 lb||||||F

      OBX|12|TX|DefaultObservationID|1|Referring Physician: Dale, P Daniel           BSA: 2.0 meters2||||||F

      OBX|13|TX|DefaultObservationID|1|Performed By: Ron DeYoung                     BP: 115/85 mmHg||||||F

      OBX|14|TX|DefaultObservationID|1|                                              HR: 85||||||F

      OBX|15|TX|DefaultObservationID|1|||||||F

      OBX|16|TX|DefaultObservationID|1|||||||F

      OBX|17|TX|DefaultObservationID|1|Interpretation Summary||||||F

      OBX|18|TX|DefaultObservationID|1|||||||F

      OBX|19|TX|DefaultObservationID|1|||||||F

      OBX|20|TX|DefaultObservationID|1|Procedure:||||||F

      OBX|21|TX|DefaultObservationID|1|A two-dimensional transthoracic echocardiogram with color flow Doppler||||||F

      OBX|22|TX|DefaultObservationID|1|was performed. The patient was in atrial fibrillation with controlled||||||F

      OBX|23|TX|DefaultObservationID|1|ventricular rate during the exam.||||||F

      OBX|24|TX|DefaultObservationID|1|Procedure:Ventricle:||||||F

      OBX|25|TX|DefaultObservationID|1|Procedure: ventricle is normal in size, thickness and function. A mass||||||F

      OBX|26|TX|DefaultObservationID|1|is noted in the left ventricle. The left ventricle is normal in||||||F

      OBX|27|TX|DefaultObservationID|1|structure and function. There are regional wall motion abnormalities||||||F

    • #72188
      Jason Bond
      Participant

      I’m also really bad at TCL.  I’m sure your code suggestions are much more valid than my testing suggests.  Can you give me the code in the proc I gave, where in the proc it goes?

    • #72189
      Jim Kosloskey
      Participant

      Jason,

      Are you intending to be case sensitive?

      In the example you sent, I don’t find the word ‘Left’ I find the word ‘left’.

      If you do not want to be case sensitive, add the -nocase switch to your string map.

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

    • #72190
      Jason Bond
      Participant

      it will end up being case sensitive, I just had those in there for testing, I was changing values a lot for test purposes.

    • #72191
      Jim Kosloskey
      Participant

      Jason,

      Show us the Tcl code you have thus far.

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

    • #72192
      Jason Bond
      Participant

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

      # Name: cpacs_string_reports

      # Purpose:

      # UPoC type: xltp

      # Args: none

      # Notes: All data is presented through special variables.  The initial

      # upvar in this proc provides access to the required variables.

      #

      # This proc style only works when called from a code fragment

      # within an XLT.

      #

      proc cpacs_string_reports {} {

         upvar xlateId       xlateId

       xlateInList   xlateInList

       xlateInTypes  xlateInTypes

       xlateInVals   xlateInVals

       xlateOutList  xlateOutList

       xlateOutTypes xlateOutTypes

       xlateOutVals  xlateOutVals

      set xlateOutVals [string match “*Procedure:*” $xlateInVals]    

      echo in $xlateInVals

      echo out $xlateOutVals

      }

    • #72193
      Jim Kosloskey
      Participant

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

      # Name: cpacs_string_reports

      # Purpose:

      # UPoC type: xltp

      # Args: none

      # Notes: All data is presented through special variables.  The initial

      # upvar in this proc provides access to the required variables.

      #

      # This proc style only works when called from a code fragment

      # within an XLT.

      #

      proc cpacs_string_reports {} {

        upvar xlateId       xlateId

      xlateInList   xlateInList

      xlateInTypes  xlateInTypes

      xlateInVals   xlateInVals

      xlateOutList  xlateOutList

      xlateOutTypes xlateOutTypes

      xlateOutVals  xlateOutVals

      set match 0

      set pattern_list

        foreach pattern $pattern_list {

            if {[string match $pattern [lindex $xlateOutVals 0]]} {

                set match 1

                break

            }

        set xlateOutVals [lreplace $xlateOutVals 0 0 $match]

        echo in $xlateInVals

        echo out $xlateOutVals

        }

        I have not tested the ove so I may have fumble fingered something but this is essentially what David Barr was suggesting and I think you should get the idea. If you would like to discuss what is there and why off line, email me.

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

    • #72194
      Jason Bond
      Participant

      thanks, I’ll give it a try.

    • #72195
      Jared Parish
      Participant

      Jason,

          One of my clients has CPACs and MEDITECH.  Meditech only accepts textual report which usually means ugly reports.  But with the following tcl code, I bold the headers to make it look a little prettier.  Here is code I use in a XLT TCL Pre Proc:

      Code:


      set debug 0
      for { set x 0 } { $x < [llength $xlateInVals] } { incr x } {
        if { $debug } { puts "list item($x):[lindex $xlateInVals $x]" }
        set item [lindex $xlateInVals $x]
        set item [string map {
        "Patient:" "\H\Patient:\N\"
        "Age/DOB:" "\H\Age/DOB:\N\"
        "Mailing Address:" "\H\Mailing Address:\N\"
        "Age:" "\H\Age:\N\"
        "Sex:" "\H\Sex:\N\"
        "City:" "\H\City:\N\"
        "State:" "\H\State:\N\"
        "Zip:" "\H\Zip:\N\"
        "Home Ph:" "\H\Home Ph:\N\"
        "Arrival:" "\H\Arrival:\N\"
        "Time Left ED:" "\H\Time Left ED:\N\"
        "RN Disposition:" "\H\RN Disposition:\N\"
        "CC / Curr Imp:" "\H\CC / Curr Imp:\N\"
        "Current Medications" "\H\Current Medications\N\"
        "Medication            Dose   Route     Frequency  Last Dose  RN Comments" "\H\Medication            Dose   Route     Frequency  Last Dose  RN Comments\N\"
        "Allergies" "\H\Allergies\N\"
        "Allergic Substance       Reaction       Severity            User Name" "\H\Allergic Substance       Reaction       Severity            User Name\N\"
        "Vital Signs" "\H\Vital Signs\N\"
        "Sys  Dia  PulsRespSAT O2 DelTemp (Route Pain SComment     Taken at  User Name" "\H\Sys  Dia  PulsRespSAT O2 DelTemp (Route Pain SComment     Taken at  User Name\N\"
        "RN Eval:" "\H\RN Eval:\N\"
        "RN Dispo:" "\H\RN Dispo:\N\"
        "Res/PA/NP:" "\H\Res/PA/NP:\N\"
        "EMS/PMD" "\H\EMS/PMD\N\"
        "Dx/Instr" "\H\Dx/Instr\N\"
        "RN/Triage" "\H\RN/Triage\N\"
        "RN Notes:" "\H\RN Notes:\N\"
        "Last Entry:" "\H\Last Entry:\N\"
        "HPI:" "\H\HPI:\N\"
        "PMH:" "\H\PMH:\N\"
        "Surgeries:" "\H\Surgeries:\N\"
        "TRIAGE DATA:" "\H\TRIAGE DATA:\N\"
        "Last Tetanus:" "\H\Last Tetanus:\N\"
        "LMP:" "\H\LMP:\N\"
        "PREHOSPITAL CARE:" "\H\PREHOSPITAL CARE:\N\"
        "SAFETY SCREENING:" "\H\SAFETY SCREENING:\N\"
        "CODE STATUS:" "\H\CODE STATUS:\N\"
        "HISTORY OF:" "\H\HISTORY OF:\N\"
        "Nurse Note:" "\H\Nurse Note:\N\"
        "hpi:" "\H\hpi:\N\"
        "GENERAL MEDICINE PHYSICAL EXAM:" "\H\GENERAL MEDICINE PHYSICAL EXAM:\N\"
        "MENTAL STATUS:" "\H\MENTAL STATUS:\N\"
        "EYES:" "\H\EYES:\N\"
        "THROAT:" "\H\THROAT:\N\"
        "NECK:" "\H\NECK:\N\"
        "CHEST WALL:" "\H\CHEST WALL:\N\"
        "HEART:" "\H\HEART:\N\"
        "LUNGS:" "\H\LUNGS:\N\"
        "ABDOMEN:" "\H\ABDOMEN:\N\"
        "GU:" "\H\GU:\N\"
        "EXTREMITIES:" "\H\EXTREMITIES:\N\"
        "SKIN:" "\H\SKIN:\N\"
        "GENERAL APPEARANCE:" "\H\GENERAL APPEARANCE:\N\"
        "Transferred from:" "\H\Transferred from:\N\"
        "HPI:" "\H\HPI:\N\"
        "Associated Symptoms:" "\H\Associated Symptoms:\N\"
        "Symptoms worsened by:" "\H\Symptoms worsened by:\N\"
        "Symptoms improved with:" "\H\Symptoms improved with:\N\"
        "History obtained from:" "\H\History obtained from:\N\"
        "ROS:" "\H\ROS:\N\"
        "LMP:" "\H\LMP:\N\"
        "PMH:" "\H\PMH:\N\"
        "Surgeries:" "\H\Surgeries:\N\"
        "FH:" "\H\FH:\N\"
        "SH:" "\H\SH:\N\"
        "PHYSICAL EXAM:" "\H\PHYSICAL EXAM:\N\"
        "VITAL SIGNS:" "\H\VITAL SIGNS:\N\"
        "GENERAL APPEARANCE:" "\H\GENERAL APPEARANCE:\N\"
        "MENTAL STATUS:" "\H\MENTAL STATUS:\N\"
        "NEURO:" "\H\NEURO:\N\"
        "HEAD:" "\H\HEAD:\N\"
        "EYES:" "\H\EYES:\N\"
        "NOSE:" "\H\NOSE:\N\"
        "MOUTH:" "\H\MOUTH:\N\"
        "THROAT:" "\H\THROAT:\N\"
        "NECK:" "\H\NECK:\N\"
        "CHEST WALL:" "\H\CHEST WALL:\N\"
        "LUNGS:" "\H\LUNGS:\N\"
        "HEART:" "\H\HEART:\N\"
        "ABDOMEN:" "\H\ABDOMEN:\N\"
        "GENITOURINARY:" "\H\GENITOURINARY:\N\"
        "BACK:" "\H\BACK:\N\"
        "RECTAL:" "\H\RECTAL:\N\"
        "EXTREMITIES:" "\H\EXTREMITIES:\N\"
        "SKIN:" "\H\SKIN:\N\"
        "DIFFERENTIAL DX:" "\H\DIFFERENTIAL DX:\N\"
        "ABDOMEN(adult) Dx:" "\H\ABDOMEN(adult) Dx:\N\"
        "CLINICAL DECSION TOOLS:" "\H\CLINICAL DECSION TOOLS:\N\"
        "RESULTS REVIEWED:" "\H\RESULTS REVIEWED:\N\"
        "ED COURSE:" "\H\ED COURSE:\N\"
        "MLP Supervision:" "\H\MLP Supervision:\N\"
        "PROCEDURE:" "\H\PROCEDURE:\N\"
        "DISPOSITION:" "\H\DISPOSITION:\N\"
        "CRITICAL CARE TIME:" "\H\CRITICAL CARE TIME:\N\"
        "MD Sgntr:" "\H\MD Sgntr:\N\"
        "RN Sgntr:" "\H\RN Sgntr:\N\"
        } $item]
        set xlateOutVals [lreplace $xlateOutVals $x $x $item]
      }

      I welcome any comments. Always looking to improve my code.

      - Jared Parish

    • #72196
      Jason Bond
      Participant

      thanks much to all who responded.

    • #72197
      David Barr
      Participant

      I would try to come up with regular expressions that matched the headers but don’t match other lines.  This makes the code shorter and less susceptible to change based on the report contents.  E.g.:

      Code:

      set debug 0
      for { set x 0 } { $x < [llength $xlateInVals] } { incr x } {
         if { $debug } { puts "list item($x):[lindex $xlateInVals $x]" }
         set item [lindex $xlateInVals $x]
         set patterns {
             {^(.*:)$}
             {^(w+/[w/]*w)$}
             {(Medication +Dose +Route +Frequency +Last Dose +RN Comments)}
         }
         foreach pat $patterns {
             if { [regsub — $pat $item {\H\1\N\} item] } {
                 break
             }
         }
         set xlateOutVals [lreplace $xlateOutVals $x $x $item]
      }

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

Forum Statistics

Registered Users
5,129
Forums
28
Topics
9,301
Replies
34,447
Topic Tags
288
Empty Topic Tags
10