Tcl提取含PIN关键字行的需求及现有代码问题排查
问题:提取文本文件中含“PIN”的整行内容
需求说明
从指定文本文件里,把所有包含“PIN”关键字的整行内容提取出来。
示例输入数据
PIN i_hbmc_ieee1500_sel_wir DIRECTION INPUT ; USE SIGNAL ; PORT LAYER K3 ; RECT 2090.163000; END END i_hbmc_ieee1500_sel_wir PIN i_hbmc_ieee1501_sel_wir DIRECTION INPUT ; USE SIGNAL ; PORT LAYER K3 ; RECT 2090.163000; END END i_hbmc_ieee1500_sel_wir wir
期望输出结果
PIN i_hbmc_ieee1500_sel_wir PIN i_hbmc_ieee1501_sel_wir
现有代码问题
用户当前的Tcl代码如下:
set filedata [open "osi_hbmp_top_briscm_1.txt" r] set file1 [ read $filedata ] puts [string compare "PIN" $file1]
运行后输出1,完全达不到预期。原因很简单:string compare是把整个文件的内容和字符串PIN做完全匹配对比,文件内容远不止PIN这几个字符,所以返回1(表示前者比后者大),这和提取目标行的需求完全不沾边。
正确解决方案
要实现需求,得逐行读取文件,判断每行是否包含PIN,符合条件就输出。下面是可行的Tcl代码:
set filedata [open "osi_hbmp_top_briscm_1.txt" r] # 逐行读取文件内容 while {[gets $filedata line] != -1} { # 检查当前行是否包含"PIN" if {[string match "*PIN*" $line]} { puts $line } } close $filedata
代码说明
- 用
gets逐行读文件,比一次性读整个文件更省内存,也方便逐行判断 string match "*PIN*" $line里的*是通配符,能匹配任意字符,只要行里有PIN就会命中- 处理完文件记得用
close关闭句柄,避免资源浪费
如果习惯用正则表达式,也可以这么写,效果一样:
set filedata [open "osi_hbmp_top_briscm_1.txt" r] while {[gets $filedata line] != -1} { if {[regexp {PIN} $line]} { puts $line } } close $filedata
内容的提问来源于stack exchange,提问作者user19842766
相关产品推荐
相关产品推荐

