使用msgread读取特定行

时间:2014-10-24 05:20:32

标签: tcl

我是tcl的新用户,只能在4天内体验这个编程脚本。

我试图访问消息文件。教师只介绍了msg命令,如msgcreate,msgget,msgread .....等。

这就是文件的样子:

NK1|1|ELIZABETH POTTER^^^^^^L|MOTHER|RIDLEYTON NURSIN
NK1|1|MARK DAVIES^^^^^^L|CARER|C/- CARA Pty.Ltd.^""^WOODVIL8|C2|||||||||||||||||||||||||||||||
PV1||I|EPIC^^^0014^^084^0014^^EMERGENCY PATIENTS IN CARE|""|||

如果索引5是O或I,我想读取第3行来确定。

##Field
set field [string match *|O|* [msgget $mh]]
set out "|O|"
if {$field == $out} {
    echo Patient class field: Outpatient
} else {
    echo Patient class fiedl: Inpatient
}

我意识到这段代码只读取了文件的第一行,所以它总是回应住院病人。

1 个答案:

答案 0 :(得分:1)

msgget似乎会读取一行,对应一条记录。哪个好;它很可能是标准Tcl命令gets的抽象。 (这个答案的其余部分假定这是真的。)

一旦你有了记录,你必须将它分成字段,然后你可以检查它的值。由于|似乎是记录分隔符,因此您可以通过以下方式拆分:

set fields [split $record "|"]

这会生成一个列表,您可以选择第二个元素:

set secondField [lindex $field 1];  # <<< zero-base indexes, like in C

结合这些:

set fields [split [msgget $mh] "|"]
set out "0"
if {[lindex $fields 1] eq $out} {
    # ...
}

请注意,因为您可能要处理许多字段,lassign命令(Tcl 8.5中的新命令,但希望您不是旧版本)可以创建奇迹:

lassign [split [msgget $mh] "|"] code inpatient name status location ...

这是最适合这种工作的。

(如果您正在处理固定宽度字段 - 不太可能,但可能 - 那么您应该string rangescan。)