简体   繁体   English

DBD :: CSV:如何使用两个f_ext-options“ .csv”和“ .csv / r”生成不同的行为?

[英]DBD::CSV: How can I generate different behavior with the two f_ext-options “.csv” and “.csv/r”?

This is from the DBD::File-documentation: 这是从DBD :: File-documentation:

f_ext f_ext

This attribute is used for setting the file extension where (CSV) files are opened. 此属性用于设置打开(CSV)文件的文件扩展名。 There are several possibilities. 有几种可能性。

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

In this case, DBD::File will open only table.csv if both table.csv and table exist in the datadir. 在这种情况下,如果table.csv和table都存在于datadir中,则DBD :: File将仅打开table.csv。 The table will still be named table. 该表仍将命名为table。 If your datadir has files with extensions, and you do not pass this attribute, your table is named table.csv, which is probably not what you wanted. 如果您的数据目录包含带有扩展名的文件,并且您没有传递此属性,则表名为table.csv,可能不是您想要的。 The extension is always case-insensitive. 该扩展名始终不区分大小写。 The table names are not. 表名不是。

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

In this case the extension is required, and all filenames that do not match are ignored. 在这种情况下,扩展名是必需的,所有不匹配的文件名都将被忽略。

It was not possible for me to generate different behavior with the two options ".csv/r" and ".csv". 我无法使用“ .csv / r”和“ .csv”这两个选项来生成不同的行为。 Could someone show me an example, where I can see the difference between ".csv/r" and ".csv"? 有人可以举一个例子,让我看到“ .csv / r”和“ .csv”之间的区别吗?

I can't seem to get it to do anything different either. 我似乎也无法做任何不同的事情。 The relevant section of code is 代码的相关部分是

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

Does this demonstrate the difference?: 这表明区别吗?:

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 only makes the .csv a preference, but nor a requirement: in the first case, the file "bar" with no .csv extension is still used, but "foo.csv" is chosen over "foo". f_ext=.csv仅将.csv作为首选项,但不是要求:在第一种情况下,仍使用不带.csv扩展名的文件“ bar”,但是将“ foo.csv”选为“ foo”。 With f_ext=.csv/r" , "bar" is ignored, as it has no ".csv" extension. 使用f_ext=.csv/r" ,” bar“被忽略,因为它没有扩展名” .csv“。

Now in version 0.39 of DBD::File this part looks like this: 现在,在DBD :: File的0.39版本中,此部分如下所示:

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

As far as I can see, the two f_ext-options are working as expected. 据我所知,这两个f_ext-options正常工作。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM