1

嗨,伙计,我有一个小问题,我读过很多与此类似的帖子,但找不到完整的答案。我需要检查今天是否是公共假期日期。我有一个“public-holiday-dates.txt”文件,其中包含公共假期日期,例如:(mmddyyyy)

01012013

07012013

12252013

我有一个变量 $today_date_is ,它有今天的日期示例:04172013 我需要在 .txt 文件中搜索这个值,如果找到则返回 1(这将是今天是公共假期日期的情况)或返回 0 如果未找到(今天是工作日)

我怎么能这样做?我应该打开文件并将所有信息加载到变量并拆分行吗?或者我可以在文件中搜索吗?我怎么能返回值 0 或 1.. 提前谢谢..

4

3 回答 3

2

游戏计划是打开文件,读取内容,然后将该内容视为列表。然后,您可以使用lsearch(list search) 命令,如果未找到该值,该命令将返回 -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
于 2013-04-17T15:45:02.370 回答
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]
于 2013-04-17T15:52:33.500 回答
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
}
于 2014-01-29T03:42:08.797 回答