use utf-8 as default encoding for .cvs files
[MojoFacets.git] / lib / MojoFacets / Import / CSV.pm
1 package MojoFacets::Import::CSV;
2
3 use warnings;
4 use strict;
5
6 use base 'Mojo::Base';
7
8 use File::Slurp;
9 use Data::Dump qw(dump);
10 use Encode;
11
12 __PACKAGE__->attr('path');
13 __PACKAGE__->attr('full_path'); # FIXME remove full_path
14
15 sub data {
16         my $self = shift;
17
18         my $path = $self->full_path || $self->path;
19
20         my $data = read_file $path, { binmode => ':raw' }; # FIXME configurable!
21         my $encoding = 'utf-8';
22         if ( $path =~ m/\.(\w+).csv/i ) {
23                 $encoding = $1;
24         }
25         warn "decoding ", length($data), " bytes using $encoding\n";
26         $data = decode($encoding, $data);
27
28         my @lines = split(/\r?\n/, $data);
29         $data = { items => [] };
30
31         my $delimiter = qr/,/;
32
33         if ( $lines[0] !~ /;/ && $lines[1] =~ /;/ ) {
34                 shift @lines; # FIXME ship non-header line
35                 $delimiter = qr/;/;
36         }
37
38         warn "$path ", $#lines + 1, " lines encoding: $encoding delimiter:",dump($delimiter);
39
40         my $header_line = shift @lines;
41
42         my @header = split( $delimiter, $header_line );
43         warn "# header ",dump( @header );
44
45         while ( my $line = shift @lines ) {
46                 chomp $line;
47                 my @v = split($delimiter, $line);
48                 my $item;
49                 foreach my $i ( 0 .. $#v ) {
50                         $item->{ $header[$i] || "f_$i" } = [ $v[$i] ];
51                 }
52                 push @{ $data->{items} }, $item;
53         }
54
55         $data->{header} = [ @header ];
56         
57         return $data;
58
59 }
60
61 1