在Tcl脚本对列表转换列(Converting Columns in a List in Tcl S

2019-10-29 18:48发布

我想一个文件的列转换中使用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 {} {}

现在,我的问题是什么是这两个额外的“{}”,什么是我的,因为脚本错误,它的产生两个额外的“{}”我怎样才能解决这个问题呢?

有谁能够帮助我?

Answer 1:

那些空括号表示空字符串。 你用最有可能的文件必须在最后几个空行。

你可以通过检查前行避免这种情况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}}]


Answer 2:

第一{}是由空行之后3 4引起的。

第二{}是通过一个空行,其指示文件结束引起的。

如果在最后一个空白行从文件中删除,那么将只有一个{}。

如果循环,然后通过以下方式进行编码,然后将不会有{}。

foreach line [split $data \n] {
    if { $line eq "" } { break }
    lappend values [lindex [split $line " "] 0]
}

@jerry有一个更好的解决方案



Answer 3:

除非间歇空字符串进行一些意义程序的任务很重要,你也可以使用从Tcl列表到删除空的字符串元素(在两端,并在两者之间)的字符串变换(空字符串元素):

concat {*}[split $data "\n"]


文章来源: Converting Columns in a List in Tcl Script
标签: tcl