2010-05-10 16 views
0

C'est du DBD :: File-documentation:DBD :: CSV: Comment générer un comportement différent avec les deux options f_ext ".csv" et ".csv/r"?

f_ext

Cet attribut est utilisé pour définir l'extension du fichier dans lequel les fichiers (CSV) sont ouverts. Il y a plusieurs possibilités.

DBI:CSV:f_dir=data;f_ext=.csv 

Dans ce cas, DBD :: File ouvrira uniquement table.csv si les deux table.csv et table existent dans le datadir. La table sera toujours nommée table. Si votre datadir contient des fichiers avec des extensions et que vous ne transmettez pas cet attribut, votre table s'appelle table.csv, ce qui n'est probablement pas ce que vous vouliez. L'extension est toujours insensible à la casse. Les noms de tables ne le sont pas.

DBI:CSV:f_dir=data;f_ext=.csv/r 

Dans ce cas, l'extension est nécessaire, et tous les noms de fichiers qui ne correspondent pas sont ignorés.

Il n'était pas possible pour moi de générer un comportement différent avec les deux options ".csv/r" et ".csv". Quelqu'un pourrait-il me montrer un exemple, où je peux voir la différence entre ".csv/r" et ".csv"?

Répondre

1

Je n'arrive pas non plus à faire quelque chose de différent. La section pertinente du code est

sub file2table 
{ 
    my ($data, $dir, $file, $file_is_tab, $quoted) = @_; 

    $file eq "." || $file eq ".."  and return; 

    my ($ext, $req) = ("", 0); 
    if ($data->{f_ext}) { 
     ($ext, my $opt) = split m/\//, $data->{f_ext}; 
     if ($ext && $opt) { 
      $opt =~ m/r/i and $req = 1; 
      } 
     } 

    (my $tbl = $file) =~ s/$ext$//i; 
    $file_is_tab and $file = "$tbl$ext"; 

    # Fully Qualified File Name 
    my $fqfn; 
    unless ($quoted) { # table names are case insensitive in SQL 
     opendir my $dh, $dir or croak "Can't open '$dir': $!"; 
     my @f = grep { lc $_ eq lc $file } readdir $dh; 
     @f == 1 and $file = $f[0]; 
     closedir $dh or croak "Can't close '$dir': $!"; 
     } 
    $fqfn = File::Spec->catfile ($dir, $file); 

    $file = $fqfn; 
    if ($ext) { 
     if ($req) { 
      # File extension required 
      $file =~ s/$ext$//i     or return; 
      } 
     else { 
      # File extension optional, skip if file with extension exists 
      grep m/$ext$/i, glob "$fqfn.*"  and return; 
      $file =~ s/$ext$//i; 
      } 
     } 

    $data->{f_map}{$tbl} = $fqfn; 
    return $tbl; 
    } # file2table 
+0

Devrait-il y avoir un "retour" si le "mon @f = grep {lc $ _ eq lc $ fichier} readdir $ dh;" - grep ne trouve pas de fichier? –

0

cette pièce ressemble à ceci dans la version 0.39 de DBD :: Fichier:

sub file2table 
{ 
    my ($self, $meta, $file, $file_is_table, $respect_case) = @_; 

    $file eq "." || $file eq ".." and return; # XXX would break a possible DBD::Dir 

    my ($ext, $req) = ("", 0); 
    if ($meta->{f_ext}) { 
    ($ext, my $opt) = split m/\//, $meta->{f_ext}; 
    if ($ext && $opt) { 
     $opt =~ m/r/i and $req = 1; 
     } 
    } 

    # (my $tbl = $file) =~ s/$ext$//i; 
    my ($tbl, $dir, $user_spec_file); 
    if ($file_is_table and defined $meta->{f_file}) { 
    $tbl = $file; 
    ($file, $dir, undef) = File::Basename::fileparse ($meta->{f_file}); 
    $user_spec_file = 1; 
    } 
    else { 
    ($tbl, $dir, undef) = File::Basename::fileparse ($file, $ext); 
    $user_spec_file = 0; 
    } 

    -d File::Spec->catdir ($meta->{f_dir}, $dir) or 
    croak (File::Spec->catdir ($meta->{f_dir}, $dir) . ": $!"); 

    !$respect_case and $meta->{sql_identifier_case} == 1 and # XXX SQL_IC_UPPER 
     $tbl = uc $tbl; 
    !$respect_case and $meta->{sql_identifier_case} == 2 and # XXX SQL_IC_LOWER 
     $tbl = lc $tbl; 
    my $searchdir = File::Spec->file_name_is_absolute ($dir) 
    ? $dir 
    : Cwd::abs_path (File::Spec->catdir ($meta->{f_dir}, $dir)); 
    $searchdir eq $meta->{f_dir} and 
    $dir = ""; 

    unless ($user_spec_file) { 
    $file_is_table and $file = "$tbl$ext"; 

    # Fully Qualified File Name 
    my $cmpsub; 
    if ($respect_case) { 
     $cmpsub = sub { 
     my ($fn, undef, $sfx) = File::Basename::fileparse ($_, qr/\.[^.]*/); 
     $fn eq $tbl and 
      return (lc $sfx eq lc $ext or !$req && !$sfx); 
     return 0; 
     } 
     } 
    else { 
     $cmpsub = sub { 
     my ($fn, undef, $sfx) = File::Basename::fileparse ($_, qr/\.[^.]*/); 
     lc $fn eq lc $tbl and 
      return (lc $sfx eq lc $ext or !$req && !$sfx); 
     return 0; 
     } 
     } 

    opendir my $dh, $searchdir or croak "Can't open '$searchdir': $!"; 
    my @f = sort { length $b <=> length $a } grep { &$cmpsub ($_) } readdir $dh; 
    @f > 0 && @f <= 2 and $file = $f[0]; 
    !$respect_case && $meta->{sql_identifier_case} == 4 and # XXX SQL_IC_MIXED 
     ($tbl = $file) =~ s/$ext$//i; 
    closedir $dh or croak "Can't close '$searchdir': $!"; 

    #(my $tdir = $dir) =~ s{^\./}{}; # XXX We do not want all tables to start with ./ 
    #$tdir and $tbl = File::Spec->catfile ($tdir, $tbl); 
    $dir and $tbl = File::Spec->catfile ($dir, $tbl); 

    my $tmpfn = $file; 
    if ($ext) { 
     if ($req) { 
     # File extension required 
    $tmpfn =~ s/$ext$//i   or return; 
     } 
#  else { 
#  # File extension optional, skip if file with extension exists 
#  grep m/$ext$/i, glob "$fqfn.*" and return; 
#  $tmpfn =~ s/$ext$//i; 
#  } 
     } 
    } 

    my $fqfn = File::Spec->catfile ($searchdir, $file); 
    my $fqbn = File::Spec->catfile ($searchdir, $tbl); 

    $meta->{f_fqfn} = $fqfn; 
    $meta->{f_fqbn} = $fqbn; 
    !defined $meta->{f_lockfile} && $meta->{f_lockfile} and 
    $meta->{f_fqln} = $meta->{f_fqbn} . $meta->{f_lockfile}; 

    $meta->{table_name} = $tbl; 

    return $tbl; 
    } # file2table 

Pour autant que je peux voir, les deux f_ext-options fonctionnent comme attendu.

1

Est-ce démontrer la différence ?:

 
sandbox % echo "a,b,c" > foo 
sandbox % echo "a,b,c" > foo.csv 
sandbox % echo "a,b,c" > bar 
sandbox % echo "a,b,c" > baz.csv 
sandbox % perl -MDBI -wle'print for DBI->connect("dbi:CSV:f_ext=.csv")->tables' 
"merijn".baz 
"merijn".bar 
"merijn".foo 
sandbox % perl -MDBI -wle'print for DBI->connect("dbi:CSV:f_ext=.csv/r")->tables' 
"merijn".baz 
"merijn".foo 
sandbox % 

f_ext=.csv ne fait que la .csv une préférence, mais ni une exigence: dans le premier cas, le fichier « bar » sans extension .csv est encore utilisé, mais "foo.csv" est choisi sur "foo". Avec f_ext=.csv/r", "bar" est ignoré, car il n'a pas d'extension ".csv".