Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/ant/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Indexing 索引文本文件数据_Indexing_Tcl - Fatal编程技术网

Indexing 索引文本文件数据

Indexing 索引文本文件数据,indexing,tcl,Indexing,Tcl,我目前有一个300行3列的文本文件 我需要遍历所有行,用3列中的值分配3个变量 这是我的伪代码: for i=1:300 variable1 = element in ith row, 1st column (i,1) variable2 = element in ith row, 2st column (i,2) variable3 = element in ith row, 1st column (i,3) end 如何调用文本文件中的(I,1)、(I,2)、(I,3)元素 谢谢。这种大小

我目前有一个300行3列的文本文件

我需要遍历所有行,用3列中的值分配3个变量

这是我的伪代码:

for i=1:300
variable1 = element in ith row, 1st column (i,1)
variable2 = element in ith row, 2st column (i,2)
variable3 = element in ith row, 1st column (i,3)
end
如何调用文本文件中的(I,1)、(I,2)、(I,3)元素


谢谢。

这种大小的文本文件很简单:它们很容易放在内存中。您可能会遇到的主要问题是Tcl(与许多编程语言一样)索引从零开始,而不是从一开始

# Read the text in
set f [open "thefile.txt"]
set data [read $f]
close $f

# Split the data into a list of lines
set data [split $data "\n"]

# Now go over the lines and extract the fields
for {set i 0} {$i < 300} {incr i} {
    set line [lindex $data $i]
    set fields [split $line]; # NB: ASSUMES FIELDS SEPARATED BY SINGLE SPACES
    set variable1 [lindex $fields 0]
    set variable2 [lindex $fields 1]
    set variable3 [lindex $fields 2]
}
最后一个复杂性是字段不一定被单个空格分割;当字段之间(甚至有时)有多个空格时,它会非常失败,因为
split
实际上是一个非常愚蠢的命令。我们通过编写一些代码来解决这个问题,使用一个更强大的Tcl命令为我们进行拆分;在这种情况下,
regexp
(正则表达式匹配命令)是正确的工具:

set f [open "thefile.txt"]
set data [read $f]
close $f

foreach line [split $data "\n"] {
    lassign [regexp -all -inline {\S+} $line] variable1 variable2 variable3
}
这种方式稍微长一点,但对于真实世界的数据来说,它更健壮。(Tcllib textutil包有其他方法来进行此拆分,但正确的方法实际上取决于输入数据的真实情况。您比我们更了解这一点!)



另外,别忘了对你指定的变量做些实际的处理。仅仅分配它们是一个相当空洞的练习。

分隔符是什么?空白?是的!分隔符是空白。请注意,
read
slurps会删除整个文件,包括最后一行的换行符。然后
拆分$data“\n”
时,由于最后一个换行符后面的空字符串,结果列表将有一个尾随的空元素。我通常使用
read-nonewline$f
来缓解这种情况。非常感谢您的帮助!我还有一个问题:每次它在for循环中循环时,我都需要生成一个输出文件,输出文件名中有索引号。(也就是说,我总共需要生成300个输出文件)例如,对于第49次迭代,我需要生成一个名为product-49.out的输出文件。你有什么建议吗?只要保留一个递增的计数器变量:
set n0;每行。。。{lassign…;incr n;put“$n$var1$var2$var3”}
set f [open "thefile.txt"]
set data [read $f]
close $f

foreach line [split $data "\n"] {
    lassign [regexp -all -inline {\S+} $line] variable1 variable2 variable3
}