The Perl Toolchain Summit needs more sponsors. If your company depends on Perl, please support this very important event.
#!/usr/bin/perl -w

# Author          : Johan Vromans
# Created On      : Tue Sep  1 15:59:04 2003
# Last Modified By: Johan Vromans
# Last Modified On: Tue Apr 11 12:04:02 2017
# Update Count    : 48
# Status          : Unknown, Use with caution!

################ Common stuff ################

use strict;

my $my_name = "csv2lsdb";

################ Command line parameters ################

my $sep = ",";			# separator
my $notesep = 1;		# change sep in note to newline
my $verbose = 0;		# more verbosity
my $pdb = "-";			# output name

# Development options (not shown with --help).
my $debug = 0;			# debugging
my $trace = 0;			# trace (show process)
my $test = 0;			# test mode.

# Process command line options.
app_options();

# Post-processing.
my $sepp = quotemeta($sep);
$trace |= ($debug || $test);

################ Presets ################

my $TMPDIR = $ENV{TMPDIR} || $ENV{TEMP} || '/usr/tmp';

################ The Process ################

use Palm::ListDB::Writer;

sub wmsg {
    my $msg = "@_";
    $msg =~ s/$/, $ARGV line $./;
    print STDERR ($msg);
}
$SIG{__WARN__} = \&wmsg;
$SIG{__DIE__} = sub { &wmsg; exit(-1) };

# First record contains DBname,Label1,Label2,Cat1,Cat2,,,,,,
my $a = <>;
chomp($a);
$a =~ s/\\$sepp/\n/g;
my ($db,$l1,$l2,@a) = map { s/\n/$sep/g; $_ } split(/$sepp/, $a);

die("$my_name: Missing database name, $ARGV line $.\n") unless $db;
die("$my_name: Missing 1st label, $ARGV line $.\n") unless $l1;
die("$my_name: Missing 2nd label, $ARGV line $.\n") unless $l2;
die("$my_name: Missing categories, $ARGV line $.\n") unless @a;

my $x = new Palm::ListDB::Writer $db,
  label1 => $l1,
  label2 => $l2,
  cat    => [ @a ];

# Subsequent records contain Cat,Field1,Field2,Note
my $tally = 0;
while ( <> ) {
    chomp;
    my @a;
    s/\\$sepp/\0/g;
    @a = split(/$sepp/,$_,4);
    $a[3] =~ s/$sepp/\n/g  if $notesep;
    for ( @a ) {
	s/\0/$sep/g;
    }

    $a[0] = "Unfiled" if $a[0] eq "";
    $x->add(@a) && $tally++;
}

$x->write($pdb);

if ( $verbose ) {
    my $ncat = $x->categories;
    print STDERR ($my_name, ": Created LSdb $pdb with ",
		  $ncat, " categor", ($ncat != 1 ? "ies" : "y"),
		  " and $tally record", ($tally != 1 ? "s" : ""),
		  "\n");
}

exit 0;

################ Subroutines ################

################ Command Line Options ################

use Getopt::Long 2.33;		# will enable help/version

sub app_options {

    GetOptions(ident	   => \&app_ident,
	       'verbose|v' => \$verbose,
	       # application specific options go here
	       "tab"	   => sub { $sep = "\t" },
	       "pdb=s"	   => \$pdb,
	       # development options
	       test	   => \$test,
	       trace	   => \$trace,
	       debug	   => \$debug)
      or Getopt::Long::HelpMessage(2);
}

sub app_ident {
    print STDOUT ("This is Palm::ListDB::Writer [$my_name $Palm::ListDB::Writer::VERSION]\n");
}

__END__

=head1 NAME

csv2lsdb - Generate a List database from a comma separated values (CSV) file

=head1 SYNOPSIS

csv2lsdb [options] [file ...]

Options:
   --pdb=XXX            the file to write the database to
   --tab		use TAB characters for separators
   --[no]sepnote	replace separators in note field by newlines
   --ident		show identification
   --help		brief help message
   --verbose		verbose information

=head1 OPTIONS

=over 8

=item B<--pdb> I<file>

The name of the file to write the database to. If omitted, the
database it written to standard output.

=item B<--tab>

The fields are separated by tabs instead of comma's.

=item B<-->[B<no>]B<sepnote>

If enabled (default), separator characters that occur in the note
field are translated into newlines.

=item B<--verbose>

More verbose information.

=item B<--version>

Print a version identification to standard output and exits.

=item B<--help>

Print a brief help message to standard output and exits.

=item B<--ident>

Prints a program identification.

=item I<file>

Input file(s) with data.

=back

=head1 DESCRIPTION

B<csv2lsdb> will read the given input file(s) and generate a Palm List
database from the data.

The first line of the input must contain

  Database,Label1,Label2,Cat1,Cat2,,,,,,

Subsequent lines contain

  Category,Field1,Field2,Note data

Note that additional separators in the note data are usually
translated into newlines. Use the B<--nosepnote> option to suppress
this.

=head1 SEE ALSO

L<Palm::ListDB::Writer>.

=head1 AUTHOR

Johan Vromans <jvromans@squirrel.nl>

=head1 COPYRIGHT

This programs is Copyright 2003, Squirrel Consultancy.

This program is free software; you can redistribute it and/or modify
it under the terms of the Perl Artistic License or the GNU General
Public License as published by the Free Software Foundation; either
version 2 of the License, or (at your option) any later version.

=cut