使用TCL在txt文件上查找日期

时间:2013-04-17 15:08:10

标签: tcl

嗨,我有一点问题我读过很多相似的帖子,但找不到完整的答案。我需要检查今天是否是公众假期日期。 我有一个公共假日日期的“public-holiday-dates.txt”文件,如:(mmddyyyy)

01012013

07012013

12252013

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

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

3 个答案:

答案 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
}