If you liked the pack solution, here's a more versatile version (with some additional test data):
#!/usr/bin/env perl
use strict;
use warnings;
my (@data, @max);
while (<DATA>) {
push @data => [ split /,/ ];
@max = map {
my $len = length $data[$#data][$_];
( $max[$_] ||= 0 ) >= $len ? $max[$_] : $len;
} 0 .. $#{$data[$#data]} - 1;
}
my $template = 'A' . join(A => ( map { $_ + 1 } @max ), '*');
print pack $template => @$_ for @data;
__DATA__
Account,Login Name,Password,Web Site,Comments,Extra
Google Docs,george123,F0oB@r,http://www.google.com/docs,The GoodleDocs
+ site,A
Amazon,george123,fo0bA7,http://www.amazon.com,The Amazone Kindle site,
+B
Apple,george123,mM_B39Aa,https://www. ... shorter,My Apple account,C
Longer Account,Login Name,Password,Web Site,Comments,D
Account,Longer Login Name,Password,Web Site,Comments,E
Account,Login Name,Longer Password,Web Site,Comments,F
Account,Login Name,Password,Longer Web Site,Comments,G
Account,Login Name,Password,Web Site,Longer Comments,H
XAccount,XLogin Name,XPassword,XWeb Site,XComments,I
Output:
$ pm_pack_fmt_txt.pl
Account Login Name Password Web Site
+ Comments Extra
Google Docs george123 F0oB@r http://www.google.com
+/docs The GoodleDocs site A
Amazon george123 fo0bA7 http://www.amazon.com
+ The Amazone Kindle site B
Apple george123 mM_B39Aa https://www. ... shor
+ter My Apple account C
Longer Account Login Name Password Web Site
+ Comments D
Account Longer Login Name Password Web Site
+ Comments E
Account Login Name Longer Password Web Site
+ Comments F
Account Login Name Password Longer Web Site
+ Comments G
Account Login Name Password Web Site
+ Longer Comments H
XAccount XLogin Name XPassword XWeb Site
+ XComments I
You could also use this technique to create a FORMAT for printf (as suggested by toolic++ earlier).
Update:
s/@max[0 .. $#max]/@max/
|