If I weren't concerned about a comma appearing inside a quoted field, I might do this:
my $columns = 6; # or 10 or 14 local $/ = ','; my @fields = (); while (<>) { push @fields, $_; if ( scalar @fields == $columns ) { print @fields; @fields = (); } } print @fields;
If I do think that a field might have a comma in it, I think I'd try to use Text::CSV.
use Text::CSV; my $wholefile = do { local $/; <> }; my $parser = Text::CSV->new(); my $status = $parser->parse( $wholefile ); my @fields = $parser->fields(); my $columns = 6; # or 10 or 14 while ( @fields ) { my @line_fields = splice @fields, 0, $columns; my $csv = Text::CSV->new(); my $status = $csv->combine( @line_fields ); print $csv->string(); }
I'm not really all that familiar with Text::CSV, so I wrote that based on the synopsis. Take it with a grain of salt.
Update: Since writing this, I notice that shmem saw something I missed, namely that the last column of the original file naturally does not have a comma between it and the first column of the original file. Neither of my solutions work in that case. The file would have to be repaired first, as suggested.
In reply to Re: splitting cvs file without line breaks
by kyle
in thread splitting cvs file without line breaks
by rendier
| For: | Use: | ||
| & | & | ||
| < | < | ||
| > | > | ||
| [ | [ | ||
| ] | ] |