Beefy Boxes and Bandwidth Generously Provided by pair Networks
Clear questions and runnable code
get the best and fastest answer

Re: Simple parse of text file to csv

by 2teez (Vicar)
on Dec 19, 2012 at 06:06 UTC ( #1009502=note: print w/replies, xml ) Need Help??

in reply to Simple parse of text file to csv

"..parsing a text file and creating a CSV file.."

of course, if you are creating a CSV file, you will have to look into module Text::CSV or Text::CSV_XS. Hence, davido's important comment.
However, for "Flat File", data you posted the following should still work:

use warnings; use strict; my %data_config; my $key; while (<DATA>) { chomp; if (/(.+?):$/) { $key = $1; } else { push @{ $data_config{$key} }, $_; # {updated} } } print "Host, OS, Version, Hot Fixes, Features\n"; for ( 'Host', 'Kernel', 'Version', 'Hot fixes', 'Enabled Features' ) { print "@{$data_config{$_}}, "; } __DATA__ Host: NetDevice1234 Kernel: Linux 2.6.18-164.11 Version: Driver 23.4.1 333.0 Hotfix BLD Edition Hot fixes: HF372590 HF372804 HF372864 Enabled Features: FTP HTTP SMTP Active Directory
Host, OS, Version, Hot Fixes, Features NetDevice1234, Linux 2.6.18-164.11, Driver 23.4.1 333.0 Hotfix BLD Edi +tion , HF372590 HF372804 HF372864, FTP HTTP SMTP Active Dir +ectory,

Thanks Tux, $key was intended, instead of $1 used in this line push ... . It has been corrected.

If you tell me, I'll forget.
If you show me, I'll remember.
if you involve me, I'll understand.
--- Author unknown to me

Replies are listed 'Best First'.
Re^2: Simple parse of text file to csv
by Tux (Abbot) on Dec 19, 2012 at 07:19 UTC

    $1 in the push should have been $key. Translated to Text::CSV_XS

    use strict; use warnings; use Text::CSV_XS; my %values; my $key; my @keys; while (<DATA>) { chomp; m/^\s*#/ and next; # Skip comment m/^\s*$/ and next; # Skip empty lines if (m/^\s* (.+?) \s*:\s* $/x) { $key = $1; push @keys, $key; next; } s/^\s+//; s/\s+$//; push @{ $values{$key} }, $_; } my $csv = Text::CSV_XS->new ({ binary => 1, auto_diag => 1, eol => "\n +" }); $csv->print (*STDOUT, \@keys); $csv->print (*STDOUT, [ map { "@$_" } @values{@keys} ]);

    With the __DATA__ section added, results in:

    Host,Kernel,Version,"Hot fixes","Enabled Features" NetDevice1234,"Linux 2.6.18-164.11","Driver 23.4.1 333.0 Hotfix BLD Ed +ition","HF372590 HF372804 HF372864","FTP HTTP SMTP Active Directory"

    Enjoy, Have FUN! H.Merijn

Log In?

What's my password?
Create A New User
Node Status?
node history
Node Type: note [id://1009502]
and all is quiet...

How do I use this? | Other CB clients
Other Users?
Others studying the Monastery: (4)
As of 2018-05-20 12:27 GMT
Find Nodes?
    Voting Booth?