RFC: Catalyst::View::CSV



I have written a module for producing CSV formatted output as a view.
It, of course, can create any sort of delimited format one desires.
Here is the POD for details.

This has also been posted on the Catalyst Developer Mailing List:
http://lists.scsys.co.uk/mailman/listinfo/catalyst-dev

=head1 NAME

Catalyst::View::CSV - Comma separated values or Delimiter separated
values for your data

=head1 SYNOPSIS

# lib/MyApp/View/CSV.pm
package MyApp::View::CSV;
use base qw( Catalyst::View::CSV );
1;

# lib/MyApp/Controller/SomeController.pm
sub example_action_1 : Local {
my ($self, $c) = @_;

# Array reference of array references.
my $data = [
['col 1','col 2','col ...','col N'], # row 1
['col 1','col 2','col ...','col N'], # row 2
['col 1','col 2','col ...','col N'], # row ...
['col 1','col 2','col ...','col N'] # row N
];

# To output your data in comma seperated values just pass your
array by reference into the 'csv' key of the stash
$c->stash->{'csv'} = $data;

# Finally forward processing to the CSV View
$c->forward('MyApp::View::CSV');
}

# Other ways of storing data
sub example_action_2 : Local {
my ($self, $c) = @_;

# Array of array references
my @data;

push(@data,['col 1','col 2','col ...','col N']); # row 1
push(@data,['col 1','col 2','col ...','col N']); # row 2
push(@data,['col 1','col 2','col ...','col N']); # row ...
push(@data,['col 1','col 2','col ...','col N']); # row N

# OR to produce a single column of data you can simply do the
following
my @data = (
'col 1 row 1',
'col 1 row 2',
'col 1 row ...',
'col 1 row N'
);

$c->stash->{'csv'} = \@data;

$c->forward('MyApp::View::CSV');
}

# Available Options to produce other types of delimiter seperated
output
sub example_action_3 : Local {
my ($self, $c) = @_;

my $data = [
['col 1','col 2','col ...','col N'], # row 1
['col 1','col 2','col ...','col N'] # row 2
];

# You can change any of the aspects of a delimiter seperated
values format by storing them in the appropriate stash key
# This is an example of tab seperated values for instance

$c->stash->{'quote_char'} = '"'; # default: '"'

$c->stash->{'escape_char'} = '"'; # default: '"'

$c->stash->{'sep_char'} = '\t'; # default: ','

$c->stash->{'eol'} = "\n"; # default: "\n"

$c->stash->{'csv'} = $data;
}

=head1 DESCRIPTION

Catalyst::View::CSV is a Catalyst View handler that returns data in
delimiter seperated values (default is comma) format.

=head1 MIME MEDIA TYPE

If the Content-Type HTTP Header is not set, it will default to 'text/
csv'.

# Example of setting your own Content-Type
$c->res->headers->header('Content-Type' => 'text/plain');

# Forward processing to CSV View with a text/plain Content-Type
$c->forward("MyApp::View::CSV");

=head1 OPTIONS

=over 4

=item quote_char

Determines what value will be enclosed within if it contains
whitespace or the delimiter character. DEFAULT: '"'

$c->stash->{'quote_char'} = '/';

=item escape_char

Determines what value will be to escape any delimiter's found in a
column. DEFAULT: '"'

$c->stash->{'escape_char'} = '/';

=item sep_char

Determines the separator between columns. DEFAULT: ','

$c->stash->{'sep_char'} = '|';

=item eol

Any characters defined in eol will be placed at the end of a row.
DEFAULT: '\n'

$c->stash->{'eol'} = '\0';

=item csv

The data that will be processed into delimiter separated values format
is stored here. The data should be an array ref of array refs of
scalars or an array ref of scalars. Note: if nothing is found in csv,
the stash is searched and any array references found will be used as
the data instead.

# Array ref of array refs of scalars
my $data = [
['apple','banana','pear'],
['red','yellow','green']
];

$c->stash->{csv} = $data;

# Array ref of scalars
my @data = ('Jan','Feb','Mar','Apr');

$c->stash->{csv} = \@data;

=back

=head1 SUBROUTINES

=over 4

=item process

This method will be called by Catalyst if it is asked to forward to a
component without a specified action.

=item render

Allows others to use this view for much more fine-grained content
generation.

=item _csv

Subroutine that actually produces the delimiter separated values.
Intended to be private in scope to this module.

=back

=head1 AUTHOR

Travis Chase - gaudeon_at_cpan_dot_org

=head1 SEE ALSO

L<Catalyst> L<Text::CSV>

=head1 LICENSE

This library is free software, you can redistribute it and/or modify
it under the same terms as Perl itself.

=cut
.



Relevant Pages

  • Re: StreamReader->regex->Win32 api marshalling
    ... as the delimiter char; which is fine unless the last field in the row is text ... >> When I said the csv data was rough, ... >>> bcp is not what I would recommend for this because it does not properly ... >>> benefit that I've seen over dts. ...
    (microsoft.public.dotnet.framework.performance)
  • RE: Convert .CSV format to .XLS format in C#
    ... .TextFileParseType = xlDelimited ... But how it is usfull in converting .csv file to .xls file. ... I used delimited and set a special delimiter character | to match your data. ...
    (microsoft.public.excel.programming)
  • RE: Export to CSV file problems
    ... below is code that you can use to manually generatte the CSV file ... For ColCount = 1 To LastCol ... OutputLine = OutputLine & Delimiter & Cells ...
    (microsoft.public.excel.programming)
  • Re: Best way to delimit text file
    ... even give you a chance to parse the data. ... CSV (alternatively rename the csv.csv ... Open each with Excel. ... The .csv tells Excel what to use as a delimiter and ...
    (microsoft.public.excel.programming)