我制作了以下 Perl 脚本来处理工作中的一些文件操作,但它现在运行速度太慢而无法投入生产。
我不太了解 Perl(不是我的语言之一),所以有人可以帮我识别和替换这个脚本中处理约 4000 万行的速度会很慢的部分吗?
输入的数据格式为:
col1|^|col2|^|col3|!|
col1|^|col2|^|col3|!|
... 40 million of these.
date_cols 数组在脚本的这一部分之前计算,基本上保存包含转换前格式的日期的列的索引。
这是将为每个输入行执行的脚本部分。我已经对其进行了一些清理并添加了评论,但如果需要其他任何内容,请告诉我:
## Read from STDIN until no more lines are arailable.
while (<STDIN>)
{
## Split by field delimiter
my @fields = split('\|\^\|', $_, -1);
## Remove the terminating delimiter from the final field so it doesn't
## interfere with date processing.
$fields[-1] = (split('\|!\|', $fields[-1], -1))[0];
## Cycle through all column numbres in date_cols and convert date
## to yyyymmdd
foreach $col (@date_cols)
{
if ($fields[$col] ne "")
{
$fields[$col] = formatTime($fields[$col]);
}
}
print(join('This is an unprintable ASCII control code', @fields), "\n");
}
## Format the input time to yyyymmdd from 'Dec 26 2012 12:00AM' like format.
sub formatTime($)
{
my $col = shift;
if (substr($col, 4, 1) eq " ") {
substr($col, 4, 1) = "0";
}
return substr($col, 7, 4).$months{substr($col, 0, 3)}.substr($col, 4, 2);
}