DBD :: CSV: Как я могу сгенерировать различное поведение с двумя f_ext-параметрами ".csv" и ".csv / r"? - PullRequest
0 голосов
/ 10 мая 2010

Это из DBD :: File-документация:

f_ext

Этот атрибут используется для настройки расширения файла, в котором открываются файлы (CSV). Есть несколько возможностей.

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

В этом случае DBD :: File откроет только table.csv, если в datadir существуют и table.csv, и таблица. Таблица по-прежнему будет называться таблицей. Если в вашем каталоге данных есть файлы с расширениями, и вы не передаете этот атрибут, ваша таблица называется table.csv, что, вероятно, не то, что вы хотели. Расширение всегда чувствительно к регистру. Имена таблиц не являются.

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

В этом случае требуется расширение, и все имена файлов, которые не совпадают, игнорируются.

Мне не удалось сгенерировать другое поведение с двумя опциями ".csv / r" и ".csv". Может кто-нибудь показать мне пример, где я вижу разницу между ".csv / r" и ".csv"?

Ответы [ 3 ]

1 голос
/ 20 августа 2010

демонстрирует ли это разницу?:

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 только делает .csv предпочтением, но не обязательным требованием: в первом случае файл "bar" без расширения .csv все еще используется, но "foo.csv" выбирается вместо "foo ». При f_ext=.csv/r" «bar» игнорируется, так как не имеет расширения «.csv».

1 голос
/ 10 мая 2010

Я тоже не могу заставить его делать что-то другое. Соответствующий раздел кода

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 голосов
/ 19 августа 2010

Теперь в версии 0.39 DBD :: File эта часть выглядит следующим образом:

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

Насколько я вижу, две опции f_ext работают как положено.

...