encode yaml in utf-8
[virtual-ldap] / bin / csv2yaml.pl
index 4526926..71d76ec 100755 (executable)
@@ -11,14 +11,14 @@ use Data::Dump qw/dump/;
 use File::Slurp;
 use YAML qw/DumpFile/;
 use Text::CSV;
-use Encode qw/decode/;
+use Encode qw/from_to/;
 
 my $debug = 0;
 
 my $path = shift @ARGV || die "usage: $0 file.csv\n";
 
 my $csv = read_file( $path );
-$csv = decode('utf-16', $csv);
+from_to($csv, 'utf-16', 'utf-8');
 
 my @columns;
 
@@ -45,14 +45,27 @@ foreach my $line ( split(/\r?\n/, $csv) ) {
                $v =~ s{^\s+}{};
                $v =~ s{\s+$}{};
 
-               if ( $v =~ m{#} ) {
-                       my @v = split(/\s*#\s*/, $v);
+               # fix tel fields
+               $v =~ s{\s+}{#}g if $n =~ m{tel};
+               $v =~ s[\x{17d}][F] if $n =~ m{spol};
+
+               if ( $v =~ m{#} ) { # subfields delimiter in CSV data
+                       my @v = split(/\s*#+\s*/, $v);
                        foreach my $pos ( 0 .. $#v ) {
+                               if ( $n =~ m{tel} ) {
+                                       if ( $v[$pos] =~ m{^09} ) {
+                                               $hash->{ $n . '_mobile' } ||= $v[$pos];
+                                       } else {
+                                               $hash->{ $n . '_fixed' } ||= $v[$pos];
+                                       }
+                               }
                                $hash->{ $n . '_' . $pos } = $v[$pos];
-                               $hash->{ $n . '_mobitel' } = $v[$pos] if $n =~ m{tel} && $v[$pos] =~ m{^09};
                        }
+
+                       $hash->{ $n } = [ @v ];
+               } else {
+                       $hash->{ $n } = $v;
                }
-               $hash->{ $n } = $v;
        }
 
        warn dump( $hash ) if $debug;