在tcl/tk中,从列表中为变量赋值

在tcl/tk中,从列表中为变量赋值,tcl,tk,Tcl,Tk,我有一个关于我在Tcl/tk中工作的问题 它转到名为sPnflds的第二行变量。 将新值分配给变量sPn和sTitlePdf。 其他行也可以。 此过程将继续进行,直到完全读取sPflds变量的所有行。此过程将对SPFLD列表的整行重复 set f [open "c:/temp/labels.txt" r] set contents [encoding convertto utf-8 [read $f]] close $f set labels [split $contents \n] #puts

我有一个关于我在Tcl/tk中工作的问题 它转到名为sPnflds的第二行变量。 将新值分配给变量sPn和sTitlePdf。 其他行也可以。 此过程将继续进行,直到完全读取sPflds变量的所有行。此过程将对SPFLD列表的整行重复

set f [open "c:/temp/labels.txt" r]
set contents [encoding convertto utf-8 [read $f]]
close $f
set labels [split $contents \n]
#puts $labels
#start of loop for first line (in labels variable)
set sPnflds [split $labels ","]
set sPn [lindex $sPnflds 0]
set sTitlePdf [lindex $sPnflds 1]
puts $sTitlePdf
puts $sPn

我觉得你的问题很难理解。您必须显示一些数据

我假设您想要迭代文件的行,而实际上代码中没有循环。 我假设每行有两个逗号分隔的字段,您希望将其捕获到这些变量中

大概是这样的:

% exec cat labels.txt
1,hello
2,world
3,foo
4,bar
% set f [open labels.txt]
file5
% set contents [encoding convertto utf-8 [read -nonewline $f]]
1,hello
2,world
3,foo
4,bar
% close $f
% set labels [split $contents \n]
1,hello 2,world 3,foo 4,bar
% foreach row $labels {
    lassign [split $row ,] sPn sTitlePdf
    puts "<$sPn> <$sTitlePdf>"
}
<1> <hello>
<2> <world>
<3> <foo>
<4> <bar>
您将得到一个空行作为行列表的最后一个元素。默认情况下,read命令为您提供带有尾随换行符的数据。我首选的迭代文件行的方法是:

set f [open filename]
while {[gets $f line] != -1} {
    do something with $line
}
close $f

假设文件的内容在内存中很合适,则速度会稍慢。

是否要附加每个sPn和sTitlePdf以保存所有事件?utf-8[read$f]的编码转换看起来很糟糕。只需使用read$f和fconfigure在通道上预先配置正确的编码。不管怎样,Tcl总是猜对了要使用的东西。嗨。谢谢你的帮助。
set f [open filename]
while {[gets $f line] != -1} {
    do something with $line
}
close $f