在tcl中拆分线来创建变量

时间:2015-11-15 10:16:24

标签: split tcl

我是TCL的新手,在需要时偶尔使用它。

我需要读取文件并提取一些数据,我已经完成了以下操作,请参阅下面的代码段。

我可以阅读第一行22,但不知道如何在变量中拆分行并提取数字1300.85。同样 从第133行提取数字1.283,从第134行提取-1.338

想知道是否有人可以提供帮助。

# Open file for reading
set input [open "Data.txt" r]

# # Code # #
set ln 0
while {[gets $input line] != -1} {
    incr ln
    if {$ln == 22} {
        set mass [regexp -all -inline {\S+} $line]
        #[split $line "/n"]
    }
}

输入数据

从文件中读取第22行(​​固定行号)将给出:

Full mass               kg           1300.85

从文件中读取行号132,133,134(固定行号)将给出以下内容:

Base (P)       :            2.621 m         (respective to )
                     F:      1.283 m   A/K: +0.489681
                     R:     -1.338 m   R/K: -0.510319

2 个答案:

答案 0 :(得分:0)

我认为星号实际上并没有出现在您的数据中。如果你能确定哪条线是哪条,这很容易。我们假设您将要处理的三行存储在变量line22line133line134中。然后你可以得到这样的值:

lindex $line22 3
# => 1300.85
lindex $line133 1
# => 1.283
lindex $line134 1
# => -1.338

这当然预先假定每行上的数据是一个正确的列表,您提供的行是。如果他们不是,您需要先split行。

如果你不是逐行阅读,而是一次读取整个文件并将其拆分成行,你可以访问这样的值:

set f [open datafile.ext]
set data [split [chan read $f] \n]
chan close $f

set mass [lindex $data 21 3]
set fval [lindex $data 132 1]
set rval [lindex $data 133 1]

通常在分割线之前会string trim,但在这种情况下可能会更改行号。

请注意,这只会在您的文件保留相同的基本内容时才有效,只会更改其位置的值。一行中添加的任何行或添加的单词将使此提取方案无效。

文档:chanlindexopensetsplit

答案 1 :(得分:0)

除非文件非常庞大(数百兆字节或更多),否则我们最好将其全部读入内存,然后通过换行对其进行split,以便我们可以轻松访问这些行。

set input [open "Data.txt" r]
set lines [split [read $input] "\n"]
close $input

然后,我们可以使用lindex选择单独的行。有几种方法可以将它们分开。在您的情况下,我们使用以下技术的一个

# With regexps (remember, Tcl indexes from zero):
regexp {kg\s([\d.]+)} [lindex $lines 21] -> value
# With regexps and list indexing:
set value [lindex [regexp -all -inline {\S+} [lindex $lines 21]] 3]
# With string format scanning (looking at how to extract the second value):
scan [lindex $lines 132] " F: %f m A/K: %f" value1 value2
scan [lindex $lines 133] " R: %f m R/K: %f" value3 value4

我想我可能实际上更喜欢scan这类工作,不过我还想仔细考虑其他方法来获取不容易插入额外行的数据。< / p>