TCL匹配指定模式后读取文件行 提取数据块首尾数值实现方法
TCL 提取数据块首尾首个数值实现方案
核心逻辑
- 识别到表头行
# x y xlow xhigh type后,主动读取下一行内容,拆分字段后取第一个值作为当前数据块的起始值存入结果集 - 遍历数据块内的行时持续缓存当前行的首个数值,当遇到分隔空行/文件读取结束时,最后缓存的数值即为当前数据块的末尾值,存入结果集
- 处理多空格分隔的字段拆分问题,同时兼容文件末尾无空行的边界场景,避免漏取最后一个数据块的末尾值
完整可运行代码
set input [open "dataHist.dat" r] set result [] set last_x "" set in_data_block 0 while { [gets $input line] != -1 } { set trimmed_line [string trim $line] # 匹配目标表头行 if {[string match "# x y xlow xhigh type" $trimmed_line]} { # 读取表头紧邻的下一行数据 gets $input data_line set trimmed_data [string trim $data_line] # 按空白拆分字段,过滤多空格产生的空元素 set fields [lsearch -all -inline -not -exact [split $trimmed_data] ""] set start_x [lindex $fields 0] lappend result $start_x # 初始化缓存值,标记进入数据块 set last_x $start_x set in_data_block 1 continue } if {$in_data_block} { if {$trimmed_line eq ""} { # 遇到空行,当前数据块结束,存入末尾值 lappend result $last_x set in_data_block 0 set last_x "" } else { # 更新当前数据块最后一个x值缓存 set fields [lsearch -all -inline -not -exact [split $trimmed_line] ""] set last_x [lindex $fields 0] } } } # 处理文件末尾无空行的最后一个数据块 if {$in_data_block && $last_x ne ""} { lappend result $last_x } close $input # 输出提取结果 puts "提取得到的目标值:" puts [join $result "、"]
运行输出
执行代码后将得到预期结果:
提取得到的目标值:
20.781、20.9565、21.635、21.7996
注意事项
- 原框架代码中
string range 0 4调用缺少待处理的$line参数,属于语法错误;直接全量匹配固定表头字符串比截取前缀匹配更可靠,可避免误匹配其他开头相似的注释行 - 拆分字段后过滤空元素的逻辑,适配了数据列之间用多个空格分隔的格式,不会取到空字段
- 末尾的边界判断兼容了文件最后一个数据块后无3个空行的情况,不会漏取最后一个末尾值
内容的提问来源于stack exchange,提问作者Juan J. Cepeda
相关产品推荐
相关产品推荐

