【问题标题】:Perl regex to change date formatPerl 正则表达式更改日期格式
【发布时间】:2018-01-17 17:47:44
【问题描述】:

我是 Perl 的新手,我需要做一个小的查找和替换来更改一组大文件中的日期格式。 这些文件的日期格式为:dd.mm.yyyy 我需要将它们更改为:mm-dd-yyyy

如何用 perl 做到这一点?

我有一个基本代码来读取目录中的文件并写入输出文件,我需要在 while 循环之间设置替换逻辑(如果我没记错的话!)。

#!c:/perl64/bin/perl.exe

#loop around a directory
@files = <C:/perl64/data/*>;

# loop around files
foreach $file (@files) {

#Read File
open READ, $file or die "Cannot open $read for read :$!";

#Output File
$fname=substr($file, rindex($file,"/")+1,length($file)-rindex($file,"/")-1);
$write="C:/perl64/output/$fname";

open WRITE, ">$write" or die "Cannot open $write for write :$!";

#Loop Around file
while (<READ>) {

           # TO DO: Change date format from dd.mm.yyyy to mm-dd-yyyy

           #Write to ourput file
           print WRITE "$_";

}

} 

问候,

阿南德

【问题讨论】:

    标签: regex perl date format replace


    【解决方案1】:

    您可以使用替换运算符s///

    while (<READ>) {
        s/(\d{2})\.(\d{2})\.(\d{4})/$2-$1-$3/;
        print WRITE "$_";
    }
    

    【讨论】:

    • 谢谢尤金!替换有效,但有一个问题。替换仅在每行中第一次出现 dd.mm.yyyy 时发生。一行中的第二个和更多出现不被替换。我做错了吗?
    • @Ahand: s/// 默认只替换第一次出现的模式。您可以使用/g 修饰符替换所有出现的位置:s/PATTERN/REPLACEMENT/g
    • 谢谢尤金。我只是通过一些谷歌搜索发现了这一点,它解决了这个问题。感谢您的帮助!
    【解决方案2】:

    这是一个简单的脚本,它将接受输入和输出目录的可选参数。

    使用 opendir 代替 glob 可以省去清理文件名的麻烦。

    use strict;
    use warnings;
    use autodie;
    
    my $indir = shift || "C:/perl64/data";
    my $outdir = shift || "C:/perl64/output";
    
    opendir(my $in, $indir);
    
    while (readdir $in) {
        next unless -f;
        open my $infile, '<', $_;
        open my $outfile, '>', $outdir . "/" . $_;
        while (<$infile>) {
            s/([0-9]{2})\.([0-9]{2})\.([0-9]{4})/$2-$1-$3/g; 
            print $outfile $_;
        }
    }
    

    【讨论】:

    • 感谢 TLP。但是由于某种原因,当我运行它时没有输出文件。我不确定我在这里做错了什么。
    • 该脚本在我尝试时有效,因此很难说为什么它在您的端不起作用。可能与您传递命令行参数的方式有关。
    猜你喜欢
    • 2011-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-09
    • 2012-06-20
    • 1970-01-01
    相关资源
    最近更新 更多