我在.CSV文件中有两个字段我解析它应该代表时间。目前,它们是5位或6位数字(即85323将是8:53:23,或163211将是16:32:11)。我需要在那里扔冒号(:)。会像
strptime->strftime
使用
Time::Piece
为这样的事情工作?或者可能不是因为它们目前被视为VARCHAR加载到MySQL表中,而应该改为TIME类型。
答案 0 :(得分:1)
尝试:
s/(\d{1,2})(\d{2})(\d{2})/$1:$2:$3/;
无需使用模块:)
答案 1 :(得分:1)
$ perl -wle 'print join(":", unpack("(A2)*", sprintf("%06d", $ARGV[0])))' 85323
08:53:23
$ perl -wle 'print join(":", unpack("(A2)*", sprintf("%06d", $ARGV[0])))' 163211
16:32:11
答案 2 :(得分:0)
提供的其他正则表达式解决方案不考虑添加前导零。
如果你有一个更新的perl支持/r
替换上的s///
返回选项,这将正常工作
$_ = sprintf('%06s', $_) =~ s/(..)(..)$/:$1:$2/r;
将$_
替换为您的变量名。
或者,如果你的perl没有/r
选项,这也会做同样的事情......
( $t = sprintf('%06s', $t) ) =~ s/(..)(..)$/:$1:$2/;
当然你可以用Time::Piece
达到同样的目的但是对于这个特殊的任务,我向你保证它更慢(更冗长)
$_ = Time::Piece->strptime(sprintf('%06s', $_), '%H%M%S')->hms;