1 package MojoFacets::Import::CSV;
9 use Data::Dump qw(dump);
11 __PACKAGE__->attr('full_path');
18 my $path = $self->full_path;
20 my $encoding = 'utf-8';
21 if ( $path =~ m/\.([\w\-]+).csv/i ) {
25 my $data = { items => [] };
28 open my $fh, "<:encoding($encoding)", $path or die "$path: $!";
30 my $possible_delimiters;
31 while ( $first =~ s/(\W)// ) {
32 $possible_delimiters->{$1}++;
34 warn "# possible_delimiters = ",dump($possible_delimiters);
35 seek $fh,0,0; # rewind for Text::CSV
37 my @sep_by_usage = sort { $possible_delimiters->{$b} <=> $possible_delimiters->{$a} } keys %$possible_delimiters;
38 my $sep_char = shift @sep_by_usage;
39 while ( $sep_char =~ m/^\s$/ ) {
40 warn "## skip whitespace separator ",dump($sep_char);
41 $sep_char = shift @sep_by_usage;
44 while ( $sep_char =~ m/^\"$/ ) {
45 warn "## skip quote separator ",dump($sep_char);
46 $sep_char = shift @sep_by_usage;
49 if ( $sep_char !~ m/,/ && $possible_delimiters->{','} && $path =~ m/\.csv/i ) {
51 warn "## csv file detected so prefer , as separator";
54 warn "sep_char = [$sep_char] for $path\n";
56 my $csv = Text::CSV->new ( { binary => 1, eol => $/, sep_char => $sep_char } )
57 or die "Cannot use CSV: ".Text::CSV->error_diag ();
59 while ( my $row = $csv->getline( $fh ) ) {
65 foreach my $i ( 0 .. $#{$row} ) {
66 $item->{ $header[$i] || "f_$i" } = [ $row->[$i] ];
68 push @{ $data->{items} }, $item;
71 $csv->eof or $csv->error_diag();
74 $data->{header} = [ @header ];