Search code examples
command-linecmdhl7

Find multiple values in different lines using command-line | CMD


I have multiple results (Radiology, Labs, Pathology, Transcriptions) for the same patient in a file and I am only interested in getting results for a set of particular values. For example: I want to look for a radiology report on the first line and patient MRN 123456789 on the second line. Can this be achieved using findstr? Thanks

MSH|^~\&|RADIOLOGY|1|SCM||20150303||ORU|20150303|T|2.3|20150303
PID||1111111|123456789^^^MRN_SB^||TEST^PATIENT^^^||19000101||^^||
PV1|1|E|ER^ER^1^SB||||||||||||||||||||||||||||||||||||||||||||||
ORC|RE|36543654|36543654|3003487889

Solution

  • @ECHO OFF
    SETLOCAL
    :: remove variables starting $
    FOR  /F "delims==" %%a In ('set $ 2^>Nul') DO SET "%%a="
    SET "found="
    SET "mrn=%1"
    FOR /f "delims=" %%o IN (q29931949.txt) DO (
     FOR /f "tokens=1-4delims=|" %%a IN ("%%o") DO (
      IF DEFINED found IF "%%a"=="PID" (
       SET "$2=%%o"
       CALL :report "%%b" "%%c" "%%d"
      )
      SET "found="
      IF "%%a"=="MSH" IF "%%b"=="RADIOLOGY" SET found=Y
      IF "%%a"=="MSH" IF "%%c"=="RADIOLOGY" SET found=Y
      IF DEFINED found SET "$1=%%o"
     )
    )
    
    GOTO :EOF
    
    :report
    SET "field=%~1"
    IF NOT DEFINED field GOTO :EOF
    FOR /f "tokens=1delims=^^" %%r IN ("%~1") DO SET "field=%%r"
    IF "%field%"=="%mrn%" FOR  /F "tokens=1*delims==" %%r In ('set $') DO ECHO(%%s
    shift
    GOTO report
    

    I used a file named q29931949.txt containing your data for my testing.

    You don't really supply enough information to produce a result. For instance, is "MRN" a required data item?

    This procedure will find two consecutive lines, the first one having "MSH" in he first column and "RADIOLOGY" in the second or third and the second line having "PID" in the first column snd either the second, third or fourth column containing the target number.

    You'd run the routine using thisbatchaname 123456789

    It accepts the parameter 123456789 and assigns that to mrn.

    It then reads the file and assigns each line in tun to %%o, and tokenises the line on |, applying tokens 1-4 to %%a..%%d rspectively.

    The main loop sets found to empty and then to Y only if the first field is MSH and the second or thid RADIOLOGY. If the found flag is set, the original line in %%o is applied to $1. Only if found is set at the start of the loop (which means that the previous line is MSH/RADIOLOGY) will the routine :report be called after $2 has the original contents of the second line assigned.

    The :report routine sets field to the first parameter to see whether there are remaining parameters to process. The for then assigns the part of the field up to the first caret (^) to field. If this matches the mrn input from the command line, then the $ variables are echoed to the console (you don't say what you actually want to do with the data). Regardless, the remaining parameters are checked.

    The reson for checking the second/third(/fourth) parameter is to cater for the presence or absence of data in the fields as consecutive | characters are interpreted as a single delimiter.