如何使用 TCL 在列中查找对应的值
How to find corresponding values in columns using TCL
我是一个普通的 matlab 用户,需要在 TCL 中做一些处理。我没有使用 tcl 的经验,所以到目前为止我所做的是通过搜索 google.
新手请见谅...
我在 A 列和 B 列中有数据是通过文件 Data_1 导入的,我想从 B 列中获取 A 列中两个数字的相应值,例如
当A为0.1则B为9,当A为0.3则B为21,将9和21存入变量以备后用
我想打开另一个文件 Data_2,它有两列 C 和 D。
我想将 D 列中 C 列中第 9 列和第 21 列(正数)之间的所有数字取平均值,然后将其放入变量中以备后用。
我首先尝试找到 0.1 和 0.3 的对应值,这就是我遇到的问题。
我可以(我认为)找到 0.1 和 0.3,但不知道如何从 B 列中获取相应的值
然后继续第二部分。
请帮忙。
Data_1 Data__2
Column A Column B Column C Column D
0 0 180 14.5
0.01 1.5 162 13.05
0.02 3 144 11.6
0.03 4.5 126 10.15
0.04 6 108 8.7
0.05 7.5 90 7.25
0.1 9 72 5.8
0.125 10.5 54 4.35
0.15 12 20 2.9
0.175 13.5 10 1.45
0.2 15 0 0
0.225 16.5 -10 -1.45
0.25 18 -20 -2.9
0.275 19.5 -54 -4.35
0.3 21 -72 -5.8
0.325 22.5 -90 -7.25
0.35 24 -108 -8.7
0.0.375 25.5 -126 -10.15
0.4 27 -144 -11.6
0.425 28.5 -162 -13.05
0.45 30 -180 -14.5
# Open files for reading
set input1 [open "Data_1.dat" r]
set input2 [open "Data_2.dat" r]
#read file
set file_data [read $input1]
#close file
close $input1
#split into lines
set data [split $file_data "\n"]
foreach line $data {
set val1 [lsearch -inline $line 0.1]
set val2 [lsearch -inline $line 0.3]
puts $val1
puts $val2
}
我没有完全遵循您 post 中的所有 if/else 逻辑,但是您可以通过多种方式处理这些文件。在您的示例中,您可以将 A 列和 B 列存储为两个单独的列表。
set acol [list]
set bcol [list]
set data [split $file_data "\n"]
foreach line $data {
lappend acol [lindex $line 0]
lappend bcol [lindex $line 1]
}
# Find the first column A value that is 0.1.
set index [lsearch -real $acol 0.1]
# Get the corresponding B value.
puts "b value: [lindex $bcol $index]"
您也可以只将 foreach 循环简化为此,而不将文件数据拆分成行。
foreach {val1 val2} $file_data {
lappend acol $val1
lappend bcol $val2
}
我会这样写:
set min_key 0.1
set max_key 0.3
set fid [open Data_1.dat r]
while {[gets $fid line] != -1} {
lassign $line a b
if {$a == $min_key} {
set min $b
}
if {$a == $max_key} {
set max $b
}
}
close $fid
set fid [open Data_2.dat r]
while {[gets $fid line] != -1} {
lassign $line c d
if {$min <= $d && $d <= $max} {
lappend values $c
}
}
close $fid
puts [join $values \n]
这输出
180
162
144
126
备注:
- 使用
while
循环遍历文件的行。
lassign
将列表的值赋给变量
我是一个普通的 matlab 用户,需要在 TCL 中做一些处理。我没有使用 tcl 的经验,所以到目前为止我所做的是通过搜索 google.
新手请见谅...
我在 A 列和 B 列中有数据是通过文件 Data_1 导入的,我想从 B 列中获取 A 列中两个数字的相应值,例如
当A为0.1则B为9,当A为0.3则B为21,将9和21存入变量以备后用
我想打开另一个文件 Data_2,它有两列 C 和 D。
我想将 D 列中 C 列中第 9 列和第 21 列(正数)之间的所有数字取平均值,然后将其放入变量中以备后用。
我首先尝试找到 0.1 和 0.3 的对应值,这就是我遇到的问题。
我可以(我认为)找到 0.1 和 0.3,但不知道如何从 B 列中获取相应的值
然后继续第二部分。
请帮忙。
Data_1 Data__2
Column A Column B Column C Column D
0 0 180 14.5
0.01 1.5 162 13.05
0.02 3 144 11.6
0.03 4.5 126 10.15
0.04 6 108 8.7
0.05 7.5 90 7.25
0.1 9 72 5.8
0.125 10.5 54 4.35
0.15 12 20 2.9
0.175 13.5 10 1.45
0.2 15 0 0
0.225 16.5 -10 -1.45
0.25 18 -20 -2.9
0.275 19.5 -54 -4.35
0.3 21 -72 -5.8
0.325 22.5 -90 -7.25
0.35 24 -108 -8.7
0.0.375 25.5 -126 -10.15
0.4 27 -144 -11.6
0.425 28.5 -162 -13.05
0.45 30 -180 -14.5
# Open files for reading
set input1 [open "Data_1.dat" r]
set input2 [open "Data_2.dat" r]
#read file
set file_data [read $input1]
#close file
close $input1
#split into lines
set data [split $file_data "\n"]
foreach line $data {
set val1 [lsearch -inline $line 0.1]
set val2 [lsearch -inline $line 0.3]
puts $val1
puts $val2
}
我没有完全遵循您 post 中的所有 if/else 逻辑,但是您可以通过多种方式处理这些文件。在您的示例中,您可以将 A 列和 B 列存储为两个单独的列表。
set acol [list]
set bcol [list]
set data [split $file_data "\n"]
foreach line $data {
lappend acol [lindex $line 0]
lappend bcol [lindex $line 1]
}
# Find the first column A value that is 0.1.
set index [lsearch -real $acol 0.1]
# Get the corresponding B value.
puts "b value: [lindex $bcol $index]"
您也可以只将 foreach 循环简化为此,而不将文件数据拆分成行。
foreach {val1 val2} $file_data {
lappend acol $val1
lappend bcol $val2
}
我会这样写:
set min_key 0.1
set max_key 0.3
set fid [open Data_1.dat r]
while {[gets $fid line] != -1} {
lassign $line a b
if {$a == $min_key} {
set min $b
}
if {$a == $max_key} {
set max $b
}
}
close $fid
set fid [open Data_2.dat r]
while {[gets $fid line] != -1} {
lassign $line c d
if {$min <= $d && $d <= $max} {
lappend values $c
}
}
close $fid
puts [join $values \n]
这输出
180
162
144
126
备注:
- 使用
while
循环遍历文件的行。 lassign
将列表的值赋给变量