使用命令行 | 在不同行中查找多个值命令指令
Find multiple values in different lines using command-line | CMD
我在一个文件中有同一患者的多个结果(放射学、实验室、病理学、转录),我只对获取一组特定值的结果感兴趣。例如:我想在第一行查找放射学报告,在第二行查找患者 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
@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 "=%%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 "=%%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",在第二或第三列中具有 "RADIOLOGY",第二行在第一列中具有 "PID" column snd 包含目标数字的第二、第三或第四列。
您 运行 使用 thisbatchaname 123456789
的例程
它接受参数 123456789
并将其分配给 mrn
。
然后读取文件并将 tun 中的每一行分配给 %%o
,并对 |
上的行进行标记,分别将标记 1-4 应用到 %%a..%%d
。
主循环将 found
设置为空,然后仅当第一个字段为 MSH
且第二个或第三个字段为 RADIOLOGY
时才设置为 Y
。如果设置了 found
标志,%%o
中的原始行将应用于 </code>。只有在循环开始时设置 <code>found
(这意味着前一行是 MSH/RADIOLOGY
)才会在 </code> 具有原始内容后调用例程 <code>:report
第二行赋值。
:report
例程将 field
设置为第一个参数,以查看是否还有剩余参数需要处理。 for
然后将第一个插入符 (^
) 之前的字段部分分配给 field
。如果这与来自命令行的 mrn
输入相匹配,那么 $
变量将 echo
发送到控制台(您没有说出您实际想要对数据做什么)。无论如何,检查其余参数。
检查 second/third(/fourth) 参数的原因是为了满足字段中是否存在数据,因为连续的 |
字符被解释为单个分隔符。
为您选择的 programming/scripting 语言找到一个 HL7 解析器库并使用它。从头开始编写 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
@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 "=%%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 "=%%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",在第二或第三列中具有 "RADIOLOGY",第二行在第一列中具有 "PID" column snd 包含目标数字的第二、第三或第四列。
您 运行 使用 thisbatchaname 123456789
的例程它接受参数 123456789
并将其分配给 mrn
。
然后读取文件并将 tun 中的每一行分配给 %%o
,并对 |
上的行进行标记,分别将标记 1-4 应用到 %%a..%%d
。
主循环将 found
设置为空,然后仅当第一个字段为 MSH
且第二个或第三个字段为 RADIOLOGY
时才设置为 Y
。如果设置了 found
标志,%%o
中的原始行将应用于 </code>。只有在循环开始时设置 <code>found
(这意味着前一行是 MSH/RADIOLOGY
)才会在 </code> 具有原始内容后调用例程 <code>:report
第二行赋值。
:report
例程将 field
设置为第一个参数,以查看是否还有剩余参数需要处理。 for
然后将第一个插入符 (^
) 之前的字段部分分配给 field
。如果这与来自命令行的 mrn
输入相匹配,那么 $
变量将 echo
发送到控制台(您没有说出您实际想要对数据做什么)。无论如何,检查其余参数。
检查 second/third(/fourth) 参数的原因是为了满足字段中是否存在数据,因为连续的 |
字符被解释为单个分隔符。
为您选择的 programming/scripting 语言找到一个 HL7 解析器库并使用它。从头开始编写 HL7 解析器是不值得的。应该有适用于您可以使用的所有流行语言的库。
如果您有具体问题,欢迎再次提问。