msgReader examples

msgReader examples include:

  • msgExtract bnd01ms4_in.tin.msg | grep 'TEST\^' | msgReader

    In this example, you first msgExtract the messages so that you can grep out TEST messages, as grep operates on newlines.

    The results are then piped to msgReader.

    Message: 1
    MSH|^~\&|MS4OC|100|CERNER|100|20080905060049||ORR^O02|00000000001786872|T|2.3
    MSA|AA|
    PID|1|000700228|444756||TEST^MCKESSON^^^||19451004|F||W|9000 PHARMACY ROAD^^LANDLOW^MO^65214^^^|||||
    ORC|NA|00010|7789399237789399||IP|N|1^ONCE^^200809050600^^9||200809050600|350987^MAR||00428^PETERS^W
    OBR||00010|7789399237789399|0337345^POTASSIUM^^K^^|||||||||||^^^^^|00428^PETERS^WALTER^R^^^MD|||||||
    ZOD|01030649620001100033734523778939923778939900000000101
    Message: 2
    MSH|^~\&|MS4OC|100|CERNER|100|20080905061606||ORR^O02|00000000001786873|T|2.3
    MSA|AA|
    PID|1|000647254|444635||TEST^TERESA^X^^||19720716|F||W|123 ANY STREET^^SAINT PETERS^MO^63376^^^ST CH
    ORC|NA|00003|7789284237789284||IP|N|1^ONCE^^200809050715^^9||200809050615|350987^MAR||00431^SEE^WILL
    OBR||00003|7789284237789284|0383224^TROPONIN T-QUANTITATIVE^^TROPT^^|||||||||||^^^^^|00431^SEE^WILLI
    ZOD|01030650710001100038322423778928423778928400000000101
    Message: 3
    MSH|^~\&|MS4ADT|100|CLOVERLEAF|100|20080905085815||ADT^A28|00000000001786887|P|2.3
    EVN|A28|20080905085812|||BOMS4TEST
    PID|1|000740037|445977||HORIZON^TEST^^^||19540504|M||W|SOMEWHERE STREET^^COLUMBIA^MO^65201^^^BOONE|B
    GT1|1|000740037|HORIZON^TEST^^^|^^^^|SOMEWHERE STREET^^COLUMBIA^MO^65201^^^BOONE|||19540504|M||A|993
  • msgReader bnd01ms4_in.tin.msg | grep PID

    Result:

    PID|1|000700228|444756||TEST^MCKESSON^^^||19451004|F||W|9000 PHARMACY ROAD^^LANDLOW^MO^65214^^^|||||
    PID|1|000647254|444635||TEST^TERESA^X^^||19720716|F||W|123 ANY STREET^^SAINT PETERS^MO^63376^^^ST CH
    PID|1|000740037|445977||HORIZON^TEST^^^||19540504|M||W|SOMEWHERE STREET^^COLUMBIA^MO^65201^^^BOONE|B
    PID|1|000740037|445977||HORIZON^TEST^^^||19540504|M||W|SOMEWHERE STREET^^COLUMBIA^MO^65201^^^BOONE|B
    PID|1|000740037|445977||HORIZON^TEST^^^||19540504|M||W|SOMEWHERE STREET^^COLUMBIA^MO^65201^^^BOONE|B
    PID|1|000740037|445977||HORIZON^TEST^^^||19540504|M||W|SOMEWHERE STREET^^COLUMBIA^MO^65201^^^BOONE|B
    PID|1|000740037|445977||HORIZON^TEST^^^||19540504|M||W|SOMEWHERE STREET^^COLUMBIA^MO^65201^^^BOONE|B
    PID|1|000740037|445977||HORIZON^TEST^^^||19540504|M||W|SOMEWHERE STREET^^COLUMBIA^MO^65201^^^BOONE|B
    PID|1|000700228|444756||TEST^MCKESSON^^^||19451004|F||W|9000 PHARMACY ROAD^^LANDLOW^MO^65214^^^|||||
  • msgReader bnd01ms4_in.tin.msg | egrep 'Message|ZIP'

    This shows the message # and the ZIP segments. You can use egrep to narrow down the search.

    Message: 1
    Message: 2
    Message: 3
    Message: 4
    Message: 5
    ZIP|10.128.18.166|BOMS4TEST|PHRE010|~~~|
    Message: 6
    ZIP|10.128.18.166|BOMS4TEST|HSRE019HL7|~~~|
    Message: 7
    ZIP|10.128.18.166|BOMS4TEST|PHRE010|~~~|
    Message: 8
    ZIP|10.128.18.166|BOMS4TEST|HSRE019HL7|~~~|
    Message: 9
    msgReader -w 70 bnd01ms4_in.tin.msg
  • This example demonstrates the -w wrapping argument. You can set any number. When setting the wrapping and then piping to grep, grep does not only show the matching lines, as in this example:
    Message: 1
    
    MSH|^~\&|MS4OC|100|CERNER|100|20080905060049||ORR^O02|000000000017868
        72|T|2.3
    MSA|AA|
    PID|1|000700228|444756||TEST^MCKESSON^^^||19451004|F||W|9000 PHARMACY
        ROAD^^LANDLOW^MO^65214^^^|||||M|UNK|00260049580|158963111
    ORC|NA|00010|7789399237789399||IP|N|1^ONCE^^200809050600^^9||20080905
        0600|350987^MAR||00428^PETERS^WALTER^R^^^MD|  4000
    OBR||00010|7789399237789399|0337345^POTASSIUM^^K^^|||||||||||^^^^^|00  428^PETERS^WALTER^R^^^MD||||||||05000000|||1^ONCE^^200809050600^^
        9||||||||||||^^^^^
    ZOD|01030649620001100033734523778939923778939900000000101
    
    Message: 2
    
    MSH|^~\&|MS4OC|100|CERNER|100|20080905061606||ORR^O02|000000000017868
        73|T|2.3
    MSA|AA|
    PID|1|000647254|444635||TEST^TERESA^X^^||19720716|F||W|123 ANY
        STREET^^SAINT PETERS^MO^63376^^^ST CHARLES|ST
        CHARLES||||S|NON|00260051230|999999989
    ORC|NA|00003|7789284237789284||IP|N|1^ONCE^^200809050715^^9||20080905
        0615|350987^MAR||00431^SEE^WILLIAM^M^^^MD|  ED
    OBR||00003|7789284237789284|0383224^TROPONIN
        T-QUANTITATIVE^^TROPT^^|||||||||||^^^^^|00431^SEE^WILLIAM^M^^^MD|
        |||||||05000000|||1^ONCE^^200809050715^^9||||||||||||^^^^^
    ZOD|01030650710001100038322423778928423778928400000000101
    
    Message: 3
    
    MSH|^~\&|MS4ADT|100|CLOVERLEAF|100|20080905085815||ADT^A28|0000000000
        1786887|P|2.3
    EVN|A28|20080905085812|||BOMS4TEST
    PID|1|000740037|445977||HORIZON^TEST^^^||19540504|M||W|SOMEWHERE
    STREET^^COLUMBIA^MO^65201^^^BOONE|BOONE||||M|UNK||993388371
    GT1|1|000740037|HORIZON^TEST^^^|^^^^|SOMEWHERE
      STREET^^COLUMBIA^MO^65201^^^BOONE|||19540504|M||A|993388371||||||||||||||||||M||||||||Y|||UNK||||||||||||||W
  • msgReader bnd01ms4_in.tin.msg | grep MSH

    Result:

    MSH|^~\&|MS4OC|100|CERNER|100|20080905060049||ORR^O02|00000000001786872|T|2.3
    MSH|^~\&|MS4OC|100|CERNER|100|20080905061606||ORR^O02|00000000001786873|T|2.3
    MSH|^~\&|MS4ADT|100|CLOVERLEAF|100|20080905085815||ADT^A28|00000000001786887|P|2.3
    MSH|^~\&|MS4ADT|100|CLOVERLEAF|100|20080905085900||ADT^A31|00000000001786888|P|2.3
    MSH|^~\&|MS4ADT|100|CLOVERLEAF|100|20080905085900||ADT^A05|00000000001786889|P|2.3
    MSH|^~\&|MS4ADT|100|CLOVERLEAF|100|20080905085900||ADT^A08|00000000001786890|P|2.3
    MSH|^~\&|MS4ADT|100|CLOVERLEAF|100|20080905090026||ADT^A01|00000000001786891|P|2.3
    MSH|^~\&|MS4ADT|100|CLOVERLEAF|100|20080905090026||ADT^A08|00000000001786892|P|2.3
    MSH|^~\&|MS4OC|100|CERNER|100|20080905103736||ORR^O02|00000000001786901|T|2.3
  • msgParser

    Parses a newline-delimited or a SMAT .msg file into HL7 fields.

    #!/usr/bin/perl -lw
    ###########################################################################
    #
    # Name: msgParser
    # Purpose: Parse HL7 into fields
    #
    ###########################################################################
    
    # Field delimiter is carriage return for segments
    $/ = "\r";
    $msgnum = 1;
    
    # Iterate over segments
    while (<>) {
       tr/\n//d;
       @fields = split '\|', $_;
       $name = shift @fields;
       exit unless $name;
       $name =~ tr/\x0B//d;
       $flag = 0;
       $n = 0;
    
       # Iterate over fields
       for (@fields) {
          tr/\x0D//d;
          tr/\x1C//d;
          $n++;
          if ($name eq "MSH")
          {
             if ($flag == 0)
             {
                print "\nMessage $msgnum\n";
                print "MSH.01: |";
                $flag = 1;
                $msgnum++
             }
             if ($n < 9)
             {
                $msh_n = $n+1;
                print "$name.0$msh_n: $_" if $_;
             } else
             {
                $msh_n = $n+1;
                print "$name.$msh_n: $_" if $_;
             }
             $flag = 1;
          }
          else
          {
             if ($n < 10)
             {
                print "$name.0$n: $_" if $_;
    
             } else
             {
                print "$name.$n: $_" if $_;
             }
          }
       }
    }