Regex 在CSV文件中使用三个字母月份格式化日期

Regex 在CSV文件中使用三个字母月份格式化日期,regex,perl,csv,Regex,Perl,Csv,我有一个CSV文件,其中日期的格式为ddMMMyyyy或ddMMMyyyy:hh:mm:ss(月份为英文,三个字母,所有大写缩写,其他数字前导零)。我在其他文件中使用regex进行了一些处理,但我不知道如何高效地转换月份(不需要将文件替换12次)。我需要将所有内容转换为更标准的yyyy-mm-dd(所有数字都带有前导零)。您可以使用Time::Piece模块完成此操作,该模块自2007年以来一直是Perl的标准部分 #!/usr/bin/perl use strict; use warning

我有一个CSV文件,其中日期的格式为
ddMMMyyyy
ddMMMyyyy:hh:mm:ss
(月份为英文,三个字母,所有大写缩写,其他数字前导零)。我在其他文件中使用regex进行了一些处理,但我不知道如何高效地转换月份(不需要将文件替换12次)。我需要将所有内容转换为更标准的
yyyy-mm-dd
(所有数字都带有前导零)。

您可以使用Time::Piece模块完成此操作,该模块自2007年以来一直是Perl的标准部分

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use Time::Piece;

my $fmt = '%d%b%Y';
$_ = '00039222910,12Jul1999,283.23,290.33,13Jul2013:12:50:01,13Jul2013:12:50:01,AH';

s/(\d\d\w\w\w\d\d\d\d)/convert($1)/ge;

say $_;

sub convert {
  my $in = shift;
  my $d;

  eval { $d = Time::Piece->strptime($in, $fmt) };

  return $@ ? $in : $d->ymd;
}

您可以使用Time::Piece模块实现这一点,该模块自2007年以来一直是Perl的标准部分

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use Time::Piece;

my $fmt = '%d%b%Y';
$_ = '00039222910,12Jul1999,283.23,290.33,13Jul2013:12:50:01,13Jul2013:12:50:01,AH';

s/(\d\d\w\w\w\d\d\d\d)/convert($1)/ge;

say $_;

sub convert {
  my $in = shift;
  my $d;

  eval { $d = Time::Piece->strptime($in, $fmt) };

  return $@ ? $in : $d->ymd;
}

您可以使用Time::Piece模块实现这一点,该模块自2007年以来一直是Perl的标准部分

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use Time::Piece;

my $fmt = '%d%b%Y';
$_ = '00039222910,12Jul1999,283.23,290.33,13Jul2013:12:50:01,13Jul2013:12:50:01,AH';

s/(\d\d\w\w\w\d\d\d\d)/convert($1)/ge;

say $_;

sub convert {
  my $in = shift;
  my $d;

  eval { $d = Time::Piece->strptime($in, $fmt) };

  return $@ ? $in : $d->ymd;
}

您可以使用Time::Piece模块实现这一点,该模块自2007年以来一直是Perl的标准部分

#!/usr/bin/perl

use strict;
use warnings;
use 5.010;
use Time::Piece;

my $fmt = '%d%b%Y';
$_ = '00039222910,12Jul1999,283.23,290.33,13Jul2013:12:50:01,13Jul2013:12:50:01,AH';

s/(\d\d\w\w\w\d\d\d\d)/convert($1)/ge;

say $_;

sub convert {
  my $in = shift;
  my $d;

  eval { $d = Time::Piece->strptime($in, $fmt) };

  return $@ ? $in : $d->ymd;
}


你的问题是什么?您希望结果是什么?很抱歉,我忘记指定我想要的是标准的
yyyy-mm-dd
格式。您查看了此线程吗?我试图换一种方式(字母到数字),但我不熟悉Perl,所以调整脚本有点棘手。你的问题是什么?您希望结果是什么?很抱歉,我忘记指定我想要的是标准的
yyyy-mm-dd
格式。您查看了此线程吗?我试图换一种方式(字母到数字),但我不熟悉Perl,所以调整脚本有点棘手。你的问题是什么?您希望结果是什么?很抱歉,我忘记指定我想要的是标准的
yyyy-mm-dd
格式。您查看了此线程吗?我试图换一种方式(字母到数字),但我不熟悉Perl,所以调整脚本有点棘手。你的问题是什么?您希望结果是什么?很抱歉,我忘记指定我想要的是标准的
yyyy-mm-dd
格式。您查看了此线程吗?我试图换一种方式(字母到数字),但我不熟悉Perl,所以调整脚本有点棘手。谢谢!如何从终端为文件的每一行运行此操作?到目前为止,您尝试了哪些操作?你有什么问题?这不是“为我编写代码”服务。你需要自己做一些努力:-)我让它工作了,但它有点难看:)在我运行的终端中,
perl-pe'BEGIN{use strict;use warning;use 5.010;use Time::Piece;my$fmt=“%d%b%Y”;sub-convert{my$In=shift;my$d;eval{$d=Time::Piece->strtime($In,$fmt)};return$@?$In:$d->ymd;}s/(\d\d\d\w\w\w\d\d\d\d\d)(:\d{2}:\d{2}:\d{2})?/convert($1)/ge'sample.csv>final.csv
。如何从文件中运行此操作?(对于perl/terminal的新特性感到抱歉!)只需将代码放在文件中,并将
while(){…}
围绕处理一行的位。谢谢!我如何从终端为文件的每一行运行此操作?到目前为止您尝试了什么?您遇到了什么问题?这不是“为我编写代码”服务。您需要自己做一些努力:-)我让它工作,但它有点难看:)在我运行的终端中,
perl-pe'BEGIN{use strict;use warnings;use 5.010;use Time::Piece;my$fmt=“%d%b%Y”;sub-convert{my$In=shift;my$d;eval{$d=Time::Piece->strtime($In,$fmt)};return$@?$In:$d->ymd;}s/(\d\d\d\w\w\d\d\d\d\d\d\d\d\d\d\d\d)转换({2:\d:\d}/2})/ge'sample.csv>final.csv
。如何从文件中运行此操作?(很抱歉perl/terminal太新了!)只需将代码放在一个文件中,并在处理行的位周围放置
while(){…}
。谢谢!如何从终端为文件的每一行运行此操作?到目前为止,您尝试了哪些操作?你有什么问题?这不是“为我编写代码”服务。你需要自己做一些努力:-)我让它工作了,但它有点难看:)在我运行的终端中,
perl-pe'BEGIN{use strict;use warning;use 5.010;use Time::Piece;my$fmt=“%d%b%Y”;sub-convert{my$In=shift;my$d;eval{$d=Time::Piece->strtime($In,$fmt)};return$@?$In:$d->ymd;}s/(\d\d\d\w\w\w\d\d\d\d\d)(:\d{2}:\d{2}:\d{2})?/convert($1)/ge'sample.csv>final.csv
。如何从文件中运行此操作?(对于perl/terminal的新特性感到抱歉!)只需将代码放在文件中,并将
while(){…}
围绕处理一行的位。谢谢!我如何从终端为文件的每一行运行此操作?到目前为止您尝试了什么?您遇到了什么问题?这不是“为我编写代码”服务。您需要自己做一些努力:-)我让它工作,但它有点难看:)在我运行的终端中,
perl-pe'BEGIN{use strict;use warnings;use 5.010;use Time::Piece;my$fmt=“%d%b%Y”;sub-convert{my$In=shift;my$d;eval{$d=Time::Piece->strtime($In,$fmt)};return$@?$In:$d->ymd;}s/(\d\d\d\w\w\d\d\d\d\d\d\d\d\d\d\d\d)转换({2:\d:\d}/2})/ge'sample.csv>final.csv
。如何从文件中运行此操作?(很抱歉perl/terminal太新了!)只需将代码放在一个文件中,并在处理行的位周围放置
while(){…}