Perl регулярное выражение для изменения формата даты - PullRequest
0 голосов
/ 31 июля 2011

Я совершенно новичок в Perl, и мне нужно сделать небольшую операцию поиска и замены, чтобы изменить формат даты в наборе больших файлов. Файлы имеют даты в формате: дд.мм.гггг и мне нужно изменить их на: мм-дд-гггг

Как мне сделать это с 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 "$_";

}

} 

С уважением,

Anand

Ответы [ 2 ]

3 голосов
/ 31 июля 2011

Вы можете использовать оператор подстановки s///:

while (<READ>) {
    s/(\d{2})\.(\d{2})\.(\d{4})/$2-$1-$3/;
    print WRITE "$_";
}
1 голос
/ 31 июля 2011

Вот простой скрипт, который будет принимать необязательные аргументы для входных и выходных каталогов.

Использование opendir вместо глобуса избавит вас от некоторых проблем при очистке имен файлов.

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 $_;
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...