我正在尝试解析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"
}
答案 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
希望此地址能解决您的问题