我有一个 csv 文件,其中除其他外,还以 h:m:s 格式存储时间,我想将这些时间转换为代表总秒数的数字。例如,如果我有 1:02:34,我希望将其替换为 1*3600 + 2*60 + 34 = 3754。
我想做的是:
- 查找格式为 h:m:s 的所有时间
- 执行格式化操作,将时间以秒为单位
- 将格式为 h:m:s 的时间替换为格式化数字(以秒为单位)
当然,我想在仅遍历文件一次的情况下进行所有这些更改。但我坚持用格式化的变量部分替换和写回文件。 如果有人能指出我正确的方向,我将不胜感激。当然,如果可以一次性做到这一点的话。
谢谢, 希杰
数据如下:
Column,Column,Column,Column,Column,Column,Column,Column,Column
1408319018,0:0:28,0:00:00,0:01:00,0:00:00,0:06:16,NA:NA:NA,0:07:32,0:8:0
1408313536,0:2:6,0:00:01,0:01:00,0:00:00,0:06:20,NA:NA:NA,0:07:40,0:9:46
1408319031,0:0:24,0:00:00,0:01:07,0:00:00,0:07:06,NA:NA:NA,0:08:30,0:8:54
1408319018,0:2:21,0:00:01,0:00:54,0:00:00,0:00:37,NA:NA:NA,0:01:51,0:4:12
1408319037,1:51:13,0:00:01,0:01:13,0:00:01,0:18:09,NA:NA:NA,0:19:41,2:10:54
1408319031,1:58:18,0:00:01,0:00:55,0:00:00,0:00:18,NA:NA:NA,0:01:30,1:59:48
这就是我的代码到目前为止的样子:
#!/usr/bin/perl
use strict;
#use warnings;
my $line;
my $file = "bla.csv";
my ($formatTime0,$formatTime1,$formatTime2,$formatTime3,$formatTime4,$formatTime5,$formatTime6);
open(my $OUTPUT, '+<'. $file);
while( $line = <$OUTPUT> ) {
$formatTime0 = formatTime( ($line =~ /,(\d:\d*:\d*)/g)[0] );
$formatTime1 = formatTime( ($line =~ /,(\d:\d*:\d*)/g)[1] );
$formatTime2 = formatTime( ($line =~ /,(\d:\d*:\d*)/g)[2] );
$formatTime3 = formatTime( ($line =~ /,(\d:\d*:\d*)/g)[3] );
$formatTime4 = formatTime( ($line =~ /,(\d:\d*:\d*)/g)[4] );
$formatTime5 = formatTime( ($line =~ /,(\d:\d*:\d*)/g)[5] );
$formatTime6 = formatTime( ($line =~ /,(\d:\d*:\d*)/g)[6] );
print $formatTime0."\t".$formatTime1."\t".$formatTime2."\t".$formatTime3."\t".$formatTime4."\t".$formatTime5."\t".$formatTime6."\n";
}
close $OUTPUT;
sub formatTime {
my $time2format = $_[0];
my (@temp) = ($time2format =~ /(\d).*(\d\d).*(\d\d)/);
my $seconds = $temp[2];
my $minutes = $temp[1];
my $hours = $temp[0];
if ($minutes > 0) {
$minutes = $minutes * 60;
}
if ($hours > 0) {
$hours = $hours * 3600;
}
my $timeINsec = $hours + $minutes + $seconds;
return $timeINsec;
}
最佳答案
此代码使用可执行替换字符串来计算每个时间字段的秒数。
设置 $^I = '.orig'
使 Perl 将原始文件的备份保留在同名但附加 .orig
的文件中。
程序期望输入文件的路径作为命令行上的参数,因此应该像这样运行
perl format_time.pl mydata.txt
use strict;
use warnings;
$^I = '.orig';
while (<>) {
s{ \b (\d{1,2}) : (\d{1,2}) : (\d{1,2}) \b }{ ($1 * 60 + $2) * 60 + $3 }gxe;
print;
}
输出
Column,Column,Column,Column,Column,Column,Column,Column,Column
1408319018,28,0,60,0,376,NA:NA:NA,452,480
1408313536,126,1,60,0,380,NA:NA:NA,460,586
1408319031,24,0,67,0,426,NA:NA:NA,510,534
1408319018,141,1,54,0,37,NA:NA:NA,111,252
1408319037,6673,1,73,1,1089,NA:NA:NA,1181,7854
1408319031,7098,1,55,0,18,NA:NA:NA,90,7188
关于Perl - 查找、格式化和替换文件中的字符串,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26854290/