使用命令行|在不同的行中查找多个值CMD

时间:2015-04-28 23:53:38

标签: command-line cmd hl7

我在同一个病人的文件中有多个结果(放射学,实验室,病理学,转录),我只对获得一组特定值的结果感兴趣。例如:我想在第一行寻找放射学报告,在第二行寻找患者MRN 123456789。 这可以用findstr实现吗?感谢

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

2 个答案:

答案 0 :(得分:1)

@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

我使用了一个名为q29931949.txt的文件,其中包含我的测试数据。

您实际上并没有提供足够的信息来产生结果。例如,是" MRN"一个必需的数据项?

这个程序会找到两个连续的行,第一行有" MSH"在他的第一栏和"放射学"在第二或第三和第二行有" PID"在第一列中,包含目标编号的第二,第三或第四列。

您使用 thisbatchaname 运行例程123456789

它接受参数123456789并将其分配给mrn

然后它会读取文件并将tun中的每一行分配给%%o,并将|上的行标记为标记,并将标记1-4分别应用于%%a..%%d

主循环将found设置为空,然后仅在第一个字段为Y且第二个字段为MSH时设置为RADIOLOGY。如果设置了found标记,%%o中的原始行将应用于$1。只有在循环开始时设置found(这意味着上一行为MSH/RADIOLOGY),才会在:report具有原始内容后调用例程$2分配的第二行。

:report例程将field设置为第一个参数,以查看是否有剩余的参数要处理。然后,for会将字段的一部分分配给第一个插入符号^)到field。如果这与命令行中的mrn输入匹配,则$变量echo已添加到控制台(您不会说出您实际想要对数据执行的操作)。无论如何,都会检查剩余的参数。

检查第二个/第三个(/第四个)参数的共振是为了满足字段中数据的存在或不存在,因为连续的|字符被解释为单个分隔符。

答案 1 :(得分:1)

为您选择的编程/脚本语言找到HL7解析器库并使用它。从头开始编写HL7解析器是不值得的。应该有适用于您可以使用的所有流行语言的库。

如果您有特定问题,请随时再次询问。