检查文件中是否包含今天的数据。如果是这样,退出。否则添加数据

时间:2014-06-19 05:32:34

标签: perl

我有一个脚本,可以运行并使用每日CSV文件中的数据更新每月CSV文件。我要添加的是一个检查,如果当前天数日期在列的文件中,那么A'那意味着数据已经从日常文件中复制过来,所以不做任何事情并退出。但是,如果今天的日期不在列A' A'然后复制数据并附加到月度文件。到目前为止我所做的工作直到我尝试附加数据。然后,即使今天的日期存在,它也总是附加。

我无法检查上次访问文件的时间,因为其他人访问该文件。

#!/usr/local/bin/perl
#use warnings;
use strict;

use POSIX 'mktime';
use POSIX 'strftime';

my @dateParts = localtime ();
my ($day, $month, $year) = @dateParts[3 .. 5];

$year  += 1900;
$month += 1;

open ( OUTPUT, '+<', "C:\\temp\\MONTHLY.CSV" )
    or die "Cannot open file $!\n";

while ( defined ( my $line = <OUTPUT> ) ) {
    chomp $line;
    my ($Date) = split ',', $line;

    if ( $Date eq "$day $month $year" ) {
        close OUTPUT;
        exit
        print "\ file has already been updated today";
    }
    elsif ( $Date ne  "$day $month $year" ) {
        #It works fine until I try this
        #open (INPUT, "C:\\temp\\DAILY.CSV")
        #     or die "Cannot open file $!\n";
        #open (OUTPUT, '>>', "C:\\temp\\MONTHLY.CSV")
        #    or die "Cannot open file $!\n";
        #<INPUT>;    
        #while ( <INPUT> ) {
        #    print OUTPUT;
        #}             
    }
}


#close INPUT;
#close OUTPUT; 

1 个答案:

答案 0 :(得分:0)

else块实际上只有一种可能的方式,即如果与if块的第一部分相关联的条件为假。

如果$Date不等于"$day $month $year",唯一可能是假的方式。

在if语句之前放置一个print语句,如下所示:

print "\$Date               ($Date)\n",
      "\$day \$month \$year ($day $month $year)\n";

当该行执行时,您将能够快速确定不匹配的位置。一定是他们不匹配的情况。为什么他们不匹配,我们无法确定,因为我们还没有看到您的输入数据。但是,如果掌握了这些信息,你应该能够推断出你出错的地方。

其他几个问题:elsif子句可能只是一个else,没有任何条件,因为逻辑规定如果$Date eq "$day $month $year"为false,那么$Date ne "$day $month $year"必须是真。

下一个问题是,您拨打exit后会立即终止该计划,使下一行“print "\ file has already been updated today";”无法访问代码。

另一个突出的问题是你打开MONTHLY.CSV文件进行读/写,你正在调用文件句柄OUTPUT,但你只是从句柄中读取。当您开始写入MONTHLY.CSV时,您已经在追加模式下重新打开了该文件。您也可以将第一个文件句柄调用与输入相关的内容,并在读取模式下打开它,而不是读/写。