【问题标题】:perl to open csv file with dynamic date in it?perl 打开带有动态日期的csv文件?
【发布时间】:2014-03-18 00:53:30
【问题描述】:

如何打开日期每天都在变化的 CSV 文件,其中日期格式为 yyyy 表示年份,dd 表示日,mmm 表示 3 个字母的月份。

这是我所知道的

  #!/usr/bin/perl

  use strict;
  use warnings;

  #Set-up Input Files
  #Inputfile
  $INFILE = "C:\\DBR_%yyyy\\%b\\Failures_input%d%h\\.csv";

  #Open input file for reading
  open (INPUT,"$INFILE") or die " cannot open $INFILE  ";

【问题讨论】:

  • ...%d 大概是一个月中的哪一天,%h 一天中的小时?
  • 为什么你的文件以\\.csv结尾?您真的在按日期和小时命名的目录中包含名为.csv 的文件吗?
  • 当您说“打开”时,您的意思是“查找并打开以供阅读”还是您的意思是“创建”?如果您打算使用这样的路径创建文件,那么请不要,因为如果您使用这种设计,相反的问题 - 查找最新文件 - 会非常混乱。另外,请切勿使用数字月份以外的任何内容,因为排序很麻烦,而且名称因地区而异。
  • 感谢您的指导,回答您的问题。我正在尝试打开文件。 %d 代表当天,即“01”、“02”等,%h 是错误的,它应该代表缩写月份,即“jan”、“feb”、“mar”。是的,我要打开的文件是。 csv.

标签: perl


【解决方案1】:

您的要求非常不清楚,并且您没有在模式中提及 %d%h

如果您想打开最新的 CSV 文件,那么您需要对路径进行嵌套搜索,找到最新的日期和时间。

这里有一些东西可能会有所帮助。此代码生成将为当前日期和时间创建的文件的路径。它使用Time::Piece 模块,它是核心 Perl 的一部分,不需要安装。默认情况下,它会重载 localtime 运算符,以便在标量上下文中返回 Time::Piece 对象。这允许直接应用模块的实用方法。

use strict;
use warnings;

use Time::Piece;

my $failures_file = localtime->strftime('C:\DBR_%Y\%b\Failures_input%d%b.csv');
my $invoices_file = localtime->strftime('C:\%Y\%b\invoices%d%b.csv');

print $failures_file, "\n";
print $invoices_file, "\n";

输出

C:\DBR_2014\Mar\Failures_input17Mar.csv
C:\2014\Mar\invoices17Mar.csv

但是我认为您更可能希望 latest 文件的名称具有该格式的路径,这有点复杂(并且是一个可怕的系统设计)。请验证您的要求,我们将能够为您提供进一步的帮助。

【讨论】:

  • 感谢您的帮助。我希望打开一个 csv 文件进行阅读,例如,用户每天将文件保存为“C:\2014\Mar\invoices17Mar.csv”。
  • 好的,我已经修改了我的答案以显示您现在说的文件路径的格式。我已经包含了您在问题中提到的失败文件和您在评论中添加的发票文件的示例。
  • 再次感谢您的帮助,当我尝试此操作时,我收到消息 Can't locate Time/Piece.pm in @INC (@INC contains: C:/Perl/site/lib .) at C:\scripts\test2.pl 第 4 行。BEGIN 失败--编译在 C:\scripts\test2.pl 第 4 行中止。
  • 那你没有安装Time::Piece。你用的是什么版本的 Perl?近七年来,该模块一直是 Perl 核心的一部分。您可能需要升级 Perl。
  • 嗨,我有 perl 5.8 build 820。但是我得到 401 授权错误,我有没有办法在没有商业版的情况下安装包?
【解决方案2】:

我想写一个关于localtime Perl 函数的答案,但是its documentation 太完整了,它甚至包括关于三字母缩写的内容。

关于文件名的字符串文字的几点说明:

  • 即使在 Windows 上,您也可以使用单个正斜杠
  • 您不必用反斜杠转义点
  • 您可以将变量“插入”到字符串中:"DBR_$yyyy" 如果$yyyy 是一个变量。

【讨论】:

  • 我应该补充一点,路径是硬编码到 Windows 和机器/产品特定的。良好的编码将涉及配置文件并适应 unix 和 windows 世界。我会将数据文件移动到 \datadir\ 而不是 Windows 机器的根目录中。
  • @alexmac:虽然您的评论是善意的,但并没有帮助。将可移植性融入所有事物远非理想。
  • 这是处理跨越操作系统边界的代码的经验,来自摩根士丹利、花旗、TD 等地的多年经验:)
  • @alexmac:允许对可能平台进行配置可能很有用,但如果我要在我的 Windows Perl 代码中支持 CP/M,我该死。
  • @Borodin,同意...我在想更多的 windows / linux ... :) 不过我明白你的意思。
【解决方案3】:

我赞同 SzG 的一般建议。

下面展示了如何使用两个核心模块将日期格式添加到文件名中。

使用Time::Piece(在 Perl 5.8 版以后的核心中):

use Time::Piece;

use strict;
use warnings;

my $infile = localtime->strftime('C:\DBR_%Y\%b\Failures_input%d.csv');

或者,如果您正在处理一个古老的盒子,请使用 POSIX 和 strftime。要查找可用的说明符,只需google strftime

use POSIX qw(strftime);

use strict;
use warnings;

my $infile = strftime 'C:\DBR_%Y\%b\Failures_input%d.csv', localtime;

输出:

C:\DBR_2014\Mar\Failures_input16.csv

【讨论】:

  • 我建议避免使用POSIX 模块。它巨大,因此会对加载时间产生巨大影响,并且除了一两个功能之外几乎没有用处。
  • 是的,我只会在非常旧的盒子上使用它。仍然记得使用 Perl 5.6。但是,我切换了模块推荐的顺序,以便我首先提到首选的Time::Piece
  • 应该让运行早于版本 10 的站点来处理后果。
猜你喜欢
  • 1970-01-01
  • 2017-12-05
  • 2018-05-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多