嗨,我有一点问题我读过很多相似的帖子,但找不到完整的答案。我需要检查今天是否是公众假期日期。 我有一个公共假日日期的“public-holiday-dates.txt”文件,如:(mmddyyyy)
01012013
07012013
12252013
我有一个变量$ today_date_is,它有今天的日期示例:04172013,我需要在.txt文件中搜索此值,如果找到则返回1(这将是今天是公共假日日期的情况)或如果找不到则返回0(今天是工作日)
我怎么能这样做?我应该打开文件并将所有信息加载到变量和分割线吗?或者我可以在文件中搜索?我怎么能返回值0或1 .. 提前谢谢..
答案 0 :(得分:2)
游戏计划是打开文件,阅读内容,然后将这些内容视为列表。然后,您可以使用lsearch
(列表搜索)命令,如果找不到该值,则返回-1:
proc is_holiday {the_date} {
set infile [open public-holiday-dates.txt]
set holidays [read $infile]
close $infile
if {[lsearch $holidays $the_date] == -1} {
return 0
} else {
return 1
}
}
您可以通过以下方式调用此程序:
if {[is_holiday $today_date_is]} {
puts "Is a holiday"
} else {
puts "Is not a holiday"
}
is_holiday
的前三行涉及打开假日文件,阅读内容和关闭 - 直接向前,但我稍后会详细讨论该文件。if
命令测试搜索结果:-1表示未找到,因此过程返回0.否则返回1 - 再次,这是非常直接的。我可以将整个if
块组合成一个语句,但我选择不是为了便于阅读,特别是对于初学者。我确信该块比以下内容更具可读性:
return [expr {[lsearch $holidays $the_date] != -1}]
回到文件名,当前程序硬编码(假设)文件名为 public-holiday-dates.txt ,这不是一个好习惯。如果文件名改变了怎么办?如果要搜索其他文件怎么办?解决此问题的一种方法是允许调用者可选地指定文件名。
proc is_holiday {the_date {holiday_filename public-holiday-dates.txt}} {
set infile [open $holiday_filename]
set holidays [read $infile]
close $infile
if {[lsearch $holidays $the_date] == -1} {
return 0
} else {
return 1
}
}
现在,如果要指定其他日历文件:
is_holiday $today_date_is other_calendar.txt
答案 1 :(得分:1)
由于文件public-holiday-dates.txt
的大小可能不是那么大,我会一次读取它,拆分行,并将结果列表存储在变量中。你可以这样做:
set fp [open "public-holiday-dates.txt" r]
set file_data [read $fp]
close $fp
set holidays [split $file_data "\n"]
将所有假期放入列表后,您可以使用lsearch
(列表搜索)在列表中搜索指定日期。一个复杂因素是lsearch
返回找到项目的索引,如果找不到则返回-1。因此,您需要将其转换为您想要的0/1。你可以这样做:
[expr [lsearch $holidays $today_date_is] > -1]
答案 2 :(得分:0)
另一种选择。您可以使用::fileutil::grep
package require fileutil
set the_date [clock format [clock seconds] -format "%m%d%y"]
if { [::fileutil::grep (?i)$the_date public-holiday-dates.txt] !="" } {
return 1
} else {
return 0
}