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

use strict;
use warnings;

our $VERSION = "0.05 - 20170920";

sub usage {
    my $err = shift and select STDERR;
    print <<"EOH";
usage: $0 [-o file] [-s S] [-m] [-c] [-i] [file]
    -o F  --out=F     output to file F (default STDOUT)
    -s S  --sep=S     set input separator to S (default ; , TAB or |)
    -m    --ms        output Dutch style MicroSoft CSV (; and \\r\\n)
    -n    --no-header CSV has no header line. If selected
                      - default input sep = ;
                      - BOM is not used/recognized
    -c    --confuse   Use confusing separation and quoting characters
    -i    --invisible Use invisible separation and quotation sequences
EOH
    exit $err;
    } # usage

use Getopt::Long qw(:config bundling);
GetOptions (
    "help|?"		=> sub { usage (0); },
    "s|sep=s"		=> \my $in_sep,
    "m|ms!"		=> \my $ms,
    "c|confuse!"	=> \my $confuse,
    "i|invisible!"	=> \my $invis,
    "n|no-header!"	=> \my $opt_n,
    "o|out=s"		=> \my $opt_o,
    ) or usage (1);
$invis and $confuse++;

use Text::CSV_XS qw( csv );

# U+0022 "	QUOTATION MARK			"
# U+002c ,	COMMA				,
# U+037e ;	GREEK QUESTION MARK		;
# U+201a ‚	SINGLE LOW-9 QUOTATION MARK	,
# U+2033 ″	DOUBLE PRIME			"
# U+2063	INVISIBLE SEPARATOR

my $io  = shift || \*DATA;
my $eol = $ms ? "\r\n" : "\n";
my $sep = $confuse ? $ms ? "\x{037e}" : $invis ? "\x{2063}" : "\x{201a}"
		   : $ms ? ";" : ",";
my $quo = $confuse ? "\x{2033}" : '"';

binmode STDOUT, ":encoding(utf-8)";

my @hdr;
my @opt_i = (in  => $io);
my @opt_o = (out => \*STDOUT, eol => $eol, sep => $sep, quo => $quo);
if ($opt_n) {
    push @opt_i,
	sep          => $in_sep // ";";
    }
else {
    push @opt_i,
	bom          => 1,
	sep_set      => [ $in_sep ? $in_sep : (";", ",", "|", "\t") ],
	keep_headers => \@hdr;
    push @opt_o,
	headers      => \@hdr;
    }
csv (in => csv (@opt_i), @opt_o);

__END__
a;b;c;d;e;f
1;2;3;4;5;6
2;3;4;5;6;7
3;4;5;6;7;8
4;5;6;7;8;9