使用TCL

时间:2018-02-05 02:35:42

标签: data-structures tcl

我有一个CSV文件,包含两列数据。 我想在两个单独的列表中检索两列数据。

我尝试过以下代码:

set fp [open "D:\\RWTH\\Mini thesis\\EclipseTCL\\TCL trial\\excelv1.csv" r]
set file_data [read $fp]
close $fp
set data [split $file_data " "]

puts $data

获得的输出

{0,245
0.0025,249
0.005,250
0.0075,252
0.01,253
0.0125,255
0.015,256
.
.
.
}

数据位于Excel工作表的2个单独列中。我希望仅从第二列i,e

中获取元素
{245,
249,
250,
252,
253,
.
.
.
}

如果有人可以帮助我,我会很高兴。

3 个答案:

答案 0 :(得分:3)

使用您已从文件中读取的file_data,您可以:

lmap row [split [string trim $file_data] \n] {
    scan $row %*f,%d
}

也就是说,修剪数据前后的空格,分割成行,然后从每一行扫描一个整数(跳过真实和逗号)。所有扫描的整数都收集在列表中。

然而,总是使用正确的工具来完成这项工作是个好主意。

package require csv

lmap row [split [string trim $file_data] \n] {
    lindex [::csv::split $row] end
}

::csv::split命令确切地知道如何拆分csv数据。在这种情况下,它并不是必需的,但使用csv包来获取csv数据是一个好习惯。

文档: csv (package)lindexlmap (for Tcl 8.5)lmappackagescansplitstring

答案 1 :(得分:0)

您最好使用“gets”来读取文件中的每一行:

set fp [open "D:\\RWTH\\Mini thesis\\EclipseTCL\\TCL trial\\excelv1.csv" r]
set secondColumnData {}
while {[gets $fp line]>=0} {
    if {[llength $line]>0} {
        lappend secondColumnData [lindex [split $line ","] 1]
    }
}
close $fp 
puts $secondColumnData

gets

答案 2 :(得分:0)

您也可以尝试:

set data [read [open "D:\\RWTH\\Mini thesis\\EclipseTCL\\TCL trial\\excelv1.csv"]]
set result [regexp -all -inline -line -- {^.*,(.*)$} $data]
set items {}
foreach {tmp item} $result {
  lappend items $item
}
puts $items

输出:

245 249 250 252 253 255 256