我正在编写一个Perl脚本来打开.csv文件,进行一些更改,在四个字段上对其进行排序,然后将其写回新文件。发现因为这个数据将用于加载MySQL表,我还需要重新格式化Date变量。目前,日期在文件中为00/00/0000,对于MySQL,需要将它们格式化为0000-00-00。现在,我只是尝试在一个字段中执行此操作,但实际上我需要在.csv文件中的每一行的三个Date字段中执行此操作。
此脚本正在运行 - 但它没有重新格式化日期字段我尝试对此进行测试。
dmgr
我添加到此脚本中的两行(不起作用)是 my $ in_date 和 my $ db_date 行。现在我还需要重新格式化DATETIME的两个字段(在每一行的末尾),即10/23/2015 10:47,我只需要在该字段中重新格式化日期,我就是这样。甚至不确定从哪里开始处理那个。
请放心,因为我是Perl的菜鸟。
编辑 - SORRY,不得不重新编辑,因为我没有注意到我的脚本的第一部分没有复制。
答案 0 :(得分:1)
使用Time::Piece
模块解析和重新格式化日期时间值,而不是使用一堆字符串函数。它有strptime
和strftime
方法为您执行此操作。这个简短的程序显示了您提到的两种日期时间格式的重新格式化。 ymd
是一种便捷方法,相当于strftime('%Y-%m-%d')
use strict;
use warnings 'all';
use feature 'say';
use Time::Piece;
my $in_date = '01/02/2003';
my $db_date = Time::Piece->strptime($in_date, '%m/%d/%Y')->ymd;
say "$in_date -> $db_date";
$in_date = '01/02/2003 04:05';
$db_date = Time::Piece->strptime($in_date, '%m/%d/%Y %H:%M')->strftime('%Y-%m-%d %H:%M');
say "$in_date -> $db_date";
01/02/2003 -> 2003-02-01
01/02/2003 04:05 -> 2003-02-01 04:05
如果您愿意,可以编写一个子程序,该子程序将原始日期及其格式字符串与所需格式一起使用。喜欢这个
use strict;
use warnings 'all';
use feature 'say';
use Time::Piece;
my $in_date = '01/02/2003';
my $db_date = date_from_to($in_date, '%m/%d/%Y', '%Y-%m-%d');
say "$in_date -> $db_date";
$in_date = '01/02/2003 04:05';
$db_date = date_from_to($in_date, '%m/%d/%Y %H:%M', '%Y-%m-%d %H:%M');
say "$in_date -> $db_date";
sub date_from_to {
my ($date, $from, $to) = @_;
Time::Piece->strptime($date, $from)->strftime($to);
}
输出与上面程序的输出相同
关于您的评论,您的代码应如下所示
$_ = join '-', (split /\//)[2,0,1] for $fields[14, 20, 23];
$_ = Time::Piece->strptime($_,'%m/%d/%Y %H:%M')->strftime('%Y-%m-%d %H:%M') for @fields[38,39];
push @data, \@fields;
但我希望看到处理日期字段的方式有一些一致性,比如
$_ = Time::Piece->strptime($_, '%m/%d/%Y')->strftime('%Y-%m-%d') for @fields[14,20,23];
$_ = Time::Piece->strptime($_, '%m/%d/%Y %H:%M')->strftime('%Y-%m-%d %H:%M') for @fields[38,39];
push @data, \@fields