Tcl 读取 csv 文件的第一行

Tcl read first line of a csv file

我正在尝试解析 CSV 以检查是否存在 headers 之一。 有时我希望第五个 arbitraryHead

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

我试图阅读第一行然后打印出来。但这不起作用... 如何读取第一行并打印所有 headers?

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"
}

读取 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 的双参数形式将其读取的行写入第二个参数中指定的变量,returns 读取行的长度(或 -1 读取失败完整的行,这在此处不重要的复杂情况下很有用)。您 然后 将该值分配给与 set 相同的变量,丢失了写入那里的字符串。您应该改为使用以下 一个 (除非您应该使用经过适当测试的包来读取 CSV 文件):

gets $fh line
set line [gets $fh]

getsreturns读到的行的单参数形式,虽然更难区分错误,但非常方便。

你能做的最简单的就是字符串匹配操作,只需要查找你想要检查的header。

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

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

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

希望这能解决您的问题