我想一个文件的列转换中使用Tcl脚本列表。 我有一个文件名“input.dat”在如下两列中的数据:
7 0
9 9
0 2
2 1
3 4
我想的第一列转换成一个列表,我写的Tcl的脚本如下:
set input [open "input.dat" r]
set data [read $input]
set values [list]
foreach line [split $data \n] {
lappend values [lindex [split $line " "] 0]
}
puts "$values"
close $input
结果显示为:7 9 0 2 3 {} {}
现在,我的问题是什么是这两个额外的“{}”,什么是我的,因为脚本错误,它的产生两个额外的“{}”我怎样才能解决这个问题呢?
有谁能够帮助我?
那些空括号表示空字符串。 你用最有可能的文件必须在最后几个空行。
你可以通过检查前行避免这种情况lappend
荷兰国际集团的第一列的列表values
:
foreach line [split $data \n] {
# if the line is not equal to blank, then lappend it
if {$line ne ""} {
lappend values [lindex [split $line " "] 0]
}
}
您还可以得到结果列表后删除这些空字符串,但它意味着你将有两个循环。 如果你不能帮助它仍然是有用的。
例如,使用lsearch
让所有不为空(可能是在这种情况下,最简单的)的值:
set values [lsearch -all -inline -not $values ""]
或lmap
来实现相同的(更复杂的IMO一点,但给人当你有更复杂的情况更多的灵活性):
set values [lmap n $values {if {$n != ""} {set n}}]
第一{}是由空行之后3 4引起的。
第二{}是通过一个空行,其指示文件结束引起的。
如果在最后一个空白行从文件中删除,那么将只有一个{}。
如果循环,然后通过以下方式进行编码,然后将不会有{}。
foreach line [split $data \n] {
if { $line eq "" } { break }
lappend values [lindex [split $line " "] 0]
}
@jerry有一个更好的解决方案
除非间歇空字符串进行一些意义程序的任务很重要,你也可以使用从Tcl列表到删除空的字符串元素(在两端,并在两者之间)的字符串变换(空字符串元素):
concat {*}[split $data "\n"]