Perl - 查找、格式化和替换文件中的字符串

标签 perl replace find format substring

我有一个 csv 文件,其中除其他外,还以 h:m:s 格式存储时间,我想将这些时间转换为代表总秒数的数字。例如,如果我有 1:02:34,我希望将其替换为 1*3600 + 2*60 + 34 = 3754

我想做的是:

  1. 查找格式为 h:m:s 的所有时间
  2. 执行格式化操作,将时间以秒为单位
  3. 将格式为 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/

相关文章:

regex - 保持字符串的前 2 部分有一个分隔符

perl - 在 perl 脚本中编写 awk 命令

javascript - 在 Nodejs 中替换字符串中的乌尔都语单词

ruby-on-rails - Rails 查找某些参数何时为空

regex - linux查找正则表达式

正则表达式捕获组子字符串

regex - perl - 提取字符串列表

perl - 使用 Net::SSH::Perl 模块执行多个命令

Python - 非常基础 'encryptor'

java - java中如何替换字符串