编写TCL代码:筛选符合数值条件的特定字符串集合
TCL代码实现:筛选符合条件的集合(排除每行最大值)
需求说明
现有文本文件,每行包含多个格式为{a[0-15] 十进制数值}的集合,集合间以空格分隔。需编写TCL代码完成以下操作:
- 筛选出数值大于5.0000的集合
- 排除每行中的最大值集合
输入输出示例
输入
{a7 32.7832} {a8 1.6795} {a9 0.4920} {a10 0.6235} {a11 0.4190} {a14 3.2500} {a6 1.5170} {a12 0.2620} {a13 0.0410} {a3 2.6730} {a4 2.7620} {a5 0.7490} {a2 2.0300} {a15 113.1600} {a3 1.0995} {a5 0.3180} {a6 0.3395} {a7 0.5600} {a8 1.4035} {a9 1.1810} {a10 0.4340} {a11 0.3430} {a13 0.6970} {a14 208.1150} {a2 1.4630} {a4 1.0820} {a3 1.0995} {a5 0.3180} {a6 0.3395} {a7 0.5600} {a8 6.0835} {a9 1.1810} {a10 0.4340} {a11 0.3430} {a13 0.6970} {a14 208.1150} {a2 1.4630} {a4 1.0820}
输出
{a7 32.7832} {a8 6.0835}
TCL实现代码
# 替换为你的目标文件路径 set input_file "input.txt" # 打开文件并逐行处理 if {[file exists $input_file]} { set fp [open $input_file r] while {[gets $fp line] != -1} { # 拆分每行的集合列表 set collections [split $line " "] set value_list [list] # 第一步:收集所有数值,确定当前行的最大值 foreach col $collections { # 移除集合首尾的大括号,拆分键和数值 set content [string trim $col "{}"] lassign [split $content " "] key num lappend value_list $num } set max_num [tcl::mathfunc::max {*}$value_list] # 第二步:遍历集合,筛选符合条件的项 foreach col $collections { set content [string trim $col "{}"] lassign [split $content " "] key num # 判断:数值大于5.0000 且 不等于当前行最大值 if {$num > 5.0000 && $num != $max_num} { puts $col } } } close $fp } else { puts "错误:文件 $input_file 不存在" }
代码说明
- 文件读取:先判断目标文件是否存在,确认存在后逐行读取内容
- 数值收集与最大值计算:遍历每行的所有集合,提取数值存入列表,通过
tcl::mathfunc::max获取当前行的最大值 - 筛选输出:再次遍历集合,检查数值是否满足「大于5.0000且不是当前行最大值」的条件,符合条件则输出原集合格式
内容的提问来源于stack exchange,提问作者user8217644
相关产品推荐
相关产品推荐

