#!/usr/bin/perl

use Getopt::Std;
use Pod::Usage;

$VERSION='0.2';     #   MJPH    27-JUN-2006     Don't output blank sfms
# $VERSION='0.1';     #   MJPH    20-JUN-2006     original

getopts('ho:u');

if ($opt_h)
{
    pod2usage( -verbose => 2);
    exit;
}

if ($opt_o)
{
    open(OUT, "> $opt_o") || die "Can't open $opt_o for output";
    binmode (OUT, ":utf8") if ($opt_u);
    select OUT;
}

$header = <>;
chomp $header;
$header =~ s/^\x{FEFF}//o if ($opt_u);
@head = get_csv($header);

$gap = 0;
while(<>)
{
    chomp;
    @dat = get_csv($_);
    next unless (@dat);
    $i = 0;
    if ($gap)
    { print "\n"; }
    else
    { $gap = 1; }
    for ($i = 0; $i < scalar @dat; $i++)
    { print "\\$head[$i] $dat[$i]\n" if ($head[$i]); }        # don't print blank sfms
}

sub get_csv
{
    my ($str) = @_;
    my (@dat) = $str =~ m/(?=.)((?:"(?:""|[^"])*")|(?:[^,]*))(?:,|$)/og;        #"
    my ($empty) = 1;

    foreach (@dat)
    { 
        s/""/"/og if (s/^"(.*)"$/$1/o);     #"
        $empty = 0 if ($_ ne '');
    }
    if ($empty)
    { return undef; }
    else
    { return @dat;}
}

__END__

=head1 NAME

csv2sh - converts Comma Separated Variables into Shoebox/Toolbox

=head1 SYNOPSIS

  csv2sh [-o file] [-u] infile

    -o file     Optional output file otherwise output goes to stdout
    -u          Assume file is in Unicode (so ignore BOM, etc.)

=head1 DESCRIPTION

csv2sh reads a comma separated variables file, as output from a spreadsheet
and converts it into standard format markers. The marker names (without \)
are assumed to be the column headers. Blank lines are ignored.
