Tcl读取csv文件的第一行

时间:2019-03-17 08:11:32

标签: csv scripting tcl

我正在尝试解析CSV,以检查是否存在标头之一。 有时候,我期望第五个栏目带有任意标题

date   time   value  result arbitraryHead 
val1   d1      10     fail
val2   d2      15     norun

我试图阅读第一行然后打印它。但这是行不通的... 如何阅读第一行并打印所有标题?

set fh [open $csv_file r]
set data [list]
set line [gets $fh line]
lappend data [split $line ,]
close $fh
foreach x $data {
    puts "$x\n"
}

2 个答案:

答案 0 :(得分:1)

读取CSV文件时,最好使用csv package in Tcllib,因为它可以处理该格式的所有尴尬情况。

特别地,csv::split特别有用(在创建CSV文件时与csv::join一起使用)。或充当包装器的各种功能。这是您在情况下使用它的方式

package require csv

set fh [open $csv_file r]
# Your data appears to be actually tab-separated, not comma-separated...
set data [csv::split [gets $fh] "\t"]
close $fh

foreach x $data {
    puts "$x\n"
}

您实际的即时错误是这样的:

set line [gets $fh line]

gets的两个参数形式将其读取的行写入第二个参数中命名的变量,并返回读取的行的长度(或在读取完整行失败时返回-1,可以为在不重要的复杂情况下很有用)。您正在然后使用set将该值分配给相同的变量,而丢失了在那里写的字符串。您应该改用以下一个(除了应该使用经过正确测试的程序包来读取CSV文件):

gets $fh line
set line [gets $fh]

gets的单参数形式返回其读取的行,这使得辨别错误更加困难,但非常方便。

答案 1 :(得分:0)

最简单的方法是字符串匹配操作,只需查找要检查的标题即可。

按照以下代码的要求,我正在检查“ arbitraryHead”

set fh [open $csv_file r]
set contents [read $fh ]

foreach x $contents {
    if {[string match "*arbitraryHead*" $x]} {
        puts "HEAD FOUND"
    }
}
close $fh

希望此地址能解决您的问题