Beefy Boxes and Bandwidth Generously Provided by pair Networks
Perl: the Markov chain saw
 
PerlMonks  

Simple parse of text file to csv

by OodaLoop (Initiate)
on Dec 19, 2012 at 04:12 UTC ( #1009486=perlquestion: print w/ replies, xml ) Need Help??
OodaLoop has asked for the wisdom of the Perl Monks concerning the following question:

I for the life of me cannot find a useful example for my needs. I am looking for a simple example of parsing a text file and creating a CSV file. For example something that converts this text file:

Line1info Line2someMoreInfo Line3 more info Line5line4IsBlank Line6isTabbed Line7isToo Line8hasMoreStuff

into this CSV file:

Line1, Line3, Line6, Line7 Line1info, Line3 more info, Line6isTabbed, Line7isToo

I figured this would be a common request but apparently I was wrong. Every example I've found does not fit the bill. If someone could point me to an example that I could use as a template to learn from that would be great. If it is easy to produce an example from the generic data I provided that would be great too.

Just in case being more specific is helpful, here is exactly what I'm trying to do

Flat File

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

Into a CVS with the following contents:

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 Directory

Thanks for any help you can provide everyone!

Comment on Simple parse of text file to csv
Select or Download Code
Re: Simple parse of text file to csv
by davido (Archbishop) on Dec 19, 2012 at 04:21 UTC

    This seems pretty straight-forward, but I'm not seeing any mention of what constitutes a record separator. I would want to nail that down before proceeding.


    Dave

Re: Simple parse of text file to csv
by rpnoble419 (Pilgrim) on Dec 19, 2012 at 04:23 UTC
    or is the data a fixed length record?
Re: Simple parse of text file to csv
by 2teez (Priest) on Dec 19, 2012 at 06:06 UTC

    "..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
    Output:
    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,

    Update:
    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

      $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?
Username:
Password:

What's my password?
Create A New User
Node Status?
node history
Node Type: perlquestion [id://1009486]
Approved by davido
Front-paged by 2teez
help
Chatterbox?
and the web crawler heard nothing...

How do I use this? | Other CB clients
Other Users?
Others imbibing at the Monastery: (6)
As of 2014-08-23 18:24 GMT
Sections?
Information?
Find Nodes?
Leftovers?
    Voting Booth?

    The best computer themed movie is:











    Results (176 votes), past polls