I'm looking for suggestions on how to optimize this perl script.
I have this script to do some minor reformatting of a file. The script does the following:
- Reads a "|" delimited file from STDIN
- Removes trailing whitespace,
- Removes "NULL" text string
- Converts columns with dates to "YYYYMMDD" format from "YYYY-MM-DD hh:mm" date format.
- Prints to STDOUT and does a kluge to keep from losing the last column of data when it is NULL. The # of of columns needs to be the same for each line.
Sample Input:
.091590.S |CHF|SWX|2011-05-23 00:00| 77.25| NULL| NULL| 78.620000000000005| NULL .091590.S |CHF|SWX|2011-05-24 00:00| 77.599999999999994| NULL| NULL| 77.25| NULL .091590.S |CHF|SWX|2011-05-25 00:00| 77.760000000000005| NULL| NULL| 77.599999999999994| NULL .091590.S |CHF|SWX|2011-05-26 00:00| 77.430000000000007| NULL| NULL| 77.760000000000005| NULL .091590.S |CHF|SWX|2011-05-27 00:00| 77.909999999999997| NULL| NULL| 77.430000000000007| NULL .091590.S |CHF|SWX|2011-05-30 00:00| 78.060000000000002| NULL| NULL| 77.909999999999997| 3506 FormattingScript.pl [col]
Where [col] can be a single number or a list of numbers delimited by comma. This input determines which column or columns need date conversion.
@updcol = split(',',@ARGV[0]); while (<STDIN>) { s/.$/|DATAEND/g; ## USING THIS TO KEEP FROM TRUNCATING NULL LAST COLUMN s/^\s*//g; s/\s*$//g; s/\s*\|/\|/g; s/\|\s*/\|/g; s/\|NULL\|/\|\|/g; s/\|NULL\s*$/\|/g; s/\|NULL\s*/\|/g; s/\|NULL$/\|/g; @dataline = split('\|',$_); if (@updcol[0] != 999) { ## REFORMAT DATES IF PARAM IS NOT 999 foreach my $col (@updcol) { $dataline[$col]=substr($dataline[$col],0,4).substr($dataline[$col],5,2).substr($dataline[$col],8,2); }} $dataline[-1]=""; $line=join('|',@dataline); print substr($line,0,-1)."\n"; } exit 0; Sample Output:
.091590.S|CHF|SWX|2011-05-23 00:00|77.25|||78.620000000000005| .091590.S|CHF|SWX|2011-05-24 00:00|77.599999999999994|||77.25| .091590.S|CHF|SWX|2011-05-25 00:00|77.760000000000005|||77.599999999999994| .091590.S|CHF|SWX|2011-05-26 00:00|77.430000000000007|||77.760000000000005| .091590.S|CHF|SWX|2011-05-27 00:00|77.909999999999997|||77.430000000000007| .091590.S|CHF|SWX|2011-05-30 00:00|78.060000000000002|||77.909999999999997|3506