use strict; use warnings;
use Text::CSV_XS 'csv';
my @records = map {
my %record;
for ( split "\n" ) {
my ($key, $val) = split ': ';
$record{$key} = $record{$key} ? join ', ', $record{$key}, $val
+ : $val;
};
\%record;
} split "\n\n", do { local $/; <DATA> };
my @col_names = qw(cn host description env keyWords l sysadm1 sysadm2
+administratorContactInfo nsHardwarePlatform version);
my @rows = map { my $record = $_; [ map { $record->{$_} || '' } @col_n
+ames ] } @records;
csv( in => \@rows, headers => \@col_names, out => '/tmp/foo.csv' );
__DATA__
cn: epcpc5
host: epcpc5
description: research server
l: Narnia Data Center
cn: epcmsp
host: epcmsp
description: Service Processor
l: Narnia Data Center
cn: post62a
host: post62a
description: network printer
keyWords: netprinter
l: Narnia Data Center
cn: tst401
host: tst401
host: tst401.narnia.org
host: srv1ck41
description: Test Application Server
env: test
keyWords: linuxserver
keyWords: nonprod
keyWords: localperl
keyWords: sudoers
l: Data Center, Narnia
sysadm1: aslan
administratorContactInfo: sciops
nsHardwarePlatform: DellR730
Output:
$ cat /tmp/foo.csv
cn,host,description,env,keyWords,l,sysadm1,sysadm2,administratorContac
+tInfo,nsHardwarePlatform,version
epcpc5,epcpc5,"research server",,,"Narnia Data Center",,,,,
epcmsp,epcmsp,"Service Processor",,,"Narnia Data Center",,,,,
post62a,post62a,"network printer",,netprinter,"Narnia Data Center",,,,
+,
tst401,"tst401, tst401.narnia.org, srv1ck41","Test Application Server"
+,test,"linuxserver, nonprod, localperl, sudoers","Data Center, Narnia
+",aslan,,sciops,DellR730,
The way forward always starts with a minimal test.
|