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]
gets
returns读到的行的单参数形式,虽然更难区分错误,但非常方便。
你能做的最简单的就是字符串匹配操作,只需要查找你想要检查的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
希望这能解决您的问题
我正在尝试解析 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]
gets
returns读到的行的单参数形式,虽然更难区分错误,但非常方便。
你能做的最简单的就是字符串匹配操作,只需要查找你想要检查的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
希望这能解决您的问题