需要将数据作为string转换为Excel可读格式
我有一个包含这种格式的datestring的数据文件:
June 11, 2012 3:47:56 PM GMT-07:00
我已经使用Perl脚本来处理该文件中的一些其他数据元素,然后将其输出为Excel的csv。 而不是愚弄Excel中的函数和公式来尝试将date – string转换为Excel可以读取的东西,我想我应该可以在Perl中更简单/快速地完成。
目的/期望的最终结果是一个时间和date戳记,我可以在Excel中做简单的math运算(例如,通过设置时间戳来获得条目之间的年龄差异)。
为此,我想结束我的date,看起来像这样:
6/11/2012 3:47:56 PM
真的,我只需要转换date,时间是完美的,并删除格林威治时间差异垃圾。
我看过代码片段和对模块的引用,这些模块似乎是以另一种方式转换的,即从“6/24/12”到“2012年6月24日”,但是这对我来说是错误的方向。
我在cpan中查找了模块时间:: piece,但并不真正了解它。 我在一个Cygwin exec中工作,所以不是一个真正的unix系统,并没有很多的man页面或perldocs的方式。
你可以使用模块Date :: Parse和POSIX函数strftime
。 CPAN中有很多模块可以parsingdate。
使用strftime格式化date真的很酷的文章
use strict; use Date::Parse; use POSIX qw/strftime/; my $time = str2time( 'June 11, 2012 3:47:56 PM GMT-07:00' ); my $date = strftime "%m/%d/%Y %H:%M:%S %p", localtime($time); print $date;
祝你好运!
如果你原来的string是:$ timestring,那么这应该工作(未testing):
my %months = (January => '1', February =>'2', March => '3', ...);
…
等等
$timestring =~ s<^(w+)\x20(\d{1,2}),\x20(\d{4})(\x20\(?:\d{1,2}\:){2}\d{1,2}\x20PM).*$><"$months{$1}/$2/$3$4">eeg
use DateTime; use DateTime::Format::Strptime; # YOU MUST ADAPT THIS PATTERN my $pat = "%b %d, %Y"; #incomplete my $d = DateTime::Format::Strptime->new( pattern => $pat, on_error => 'croak' ); my $dt = $d->parse_datetime($strdate); say $dt->mdy("/") . " " . $dt->hms(":") . " " . $dt->am_or_pm;
但请注意,Excel优先selectISO格式的date时间types:
say $dt->ymd('-') . 'T' . $dt->hms(':');
为了优化模式$ pat,请阅读DateTime :: Format :: Strptime的模块文档。 它最适合parsing非常均匀的input数据。 遇到最轻微的偏差,模块将不会parsing它(但你可以解决这个问题)
许多人有他们最喜欢的时间parsing技术。 我喜欢Time :: Piece,因为它带有Perl(至less在5.10以上的版本):
my $time_string = "June 11, 2012 3:47:56 PM GMT-7:00"; my $time_string =~ / GMT.*$//; # That "GMT-7:00" messes things up! say $time_string # June 11, 2012 3:47:56 PM GMT my $time = Time::Piece->strptime( $time_string, "%B %d, %Y %l:%M:%S %p" ); say $time->strftime("%D %l:%M:%S %p");
$foo->bar
是面向对象的编码风格,它正在成为Perl未来的方式,所以你最好使用它 。
这并不是那么复杂。 基本上,你创build一个包含所有数据的容器 。 散列可以容纳各种信息的方式。
当我这样做:
my $time = Time::Piece->strptime( "$time_string", "$time_format" );
我创build了一个名为$time
的Time::Piece
对象(nee容器),用于存储时间。
当你说$time->Weekday
,你实际上正在执行一个名为Weekday
的子例程,它接受你的$time
容器 ,从中提取信息,parsing时间并返回星期几。
strptime
( strptime
P ass TIME ) 构造函数 (它是创build容器的函数)将取出你的时间string(第一个参数)和它的格式(第二个参数)并创build$time
对象。 各种%M
和%d
指定特定的时间字段。 这些可以在strptime手册中find。
您可以使用Unix date
命令来使用这些格式:
$ date "+%m/%d/%y" 08/23/13 $ date "+%m/%d/%Y" 08/23/2013 $ date "%Y-%m-%d" 2013-08-23
这可能会让你感觉更舒适。
strftime
( STR ing F ormat TIME )方法(nee子程序)与strptime
相反。 这需要时间(在$time
并以您指定的格式返回时间。