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

使用TCL在txt文件中查找日期,tcl,Tcl,嗨,伙计,我有一个小问题,我读过很多类似的帖子,但找不到完整的答案。我需要检查一下今天是否是公共假日。 我有一个“publicalidates.txt”文件,其中包含公共假日日期,如:(mmddyyy) 01012013 07012013 12252013 我有一个变量$today_date_is,它有today date示例:04172013,我需要在.txt文件中搜索该值,如果找到,则返回1(如果今天是公共假日日期),如果找不到,则返回0(今天是工作日) 我怎么能这样做?我应该打开文件并将所

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

01012013

07012013

12252013

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

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

游戏计划是打开文件,读取内容,然后将内容作为列表处理。然后可以使用
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"
}
讨论
  • 过程的前三行是_holiday处理打开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

由于文件
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"]
[expr [lsearch $holidays $today_date_is] > -1]
在列表中列出所有假期后,可以使用
lsearch
(列表搜索)在列表中搜索给定日期。一个复杂的问题是
lsearch
返回找到项的索引,如果没有找到,则返回-1。因此,您需要将其转换为所需的0/1。您可以按如下方式进行操作:

set fp [open "public-holiday-dates.txt" r]
set file_data [read $fp]
close $fp
set holidays [split $file_data "\n"]
[expr [lsearch $holidays $today_date_is] > -1]

另一种选择。你可以用


从TCL8.5开始,我会做
[expr{$today\u date\u在$holidays}]