Perl DBD::CSV:如何使用两个f_ext-options生成不同的行为;。csv";及";。csv/r";?
这来自DBD::文件文档: 外线 此属性用于设置打开(CSV)文件的文件扩展名。有几种可能性 在这种情况下,如果datadir中同时存在table.csv和table,则DBD::File将仅打开table.csv。该表仍将命名为table。如果您的datadir有扩展名为的文件,而您没有传递此属性,那么您的表名为table.csv,这可能不是您想要的。扩展始终不区分大小写。表名不正确 在这种情况下,扩展名是必需的,所有不匹配的文件名都将被忽略Perl DBD::CSV:如何使用两个f_ext-options生成不同的行为;。csv";及";。csv/r";?,perl,csv,dbi,Perl,Csv,Dbi,这来自DBD::文件文档: 外线 此属性用于设置打开(CSV)文件的文件扩展名。有几种可能性 在这种情况下,如果datadir中同时存在table.csv和table,则DBD::File将仅打开table.csv。该表仍将命名为table。如果您的datadir有扩展名为的文件,而您没有传递此属性,那么您的表名为table.csv,这可能不是您想要的。扩展始终不区分大小写。表名不正确 在这种情况下,扩展名是必需的,所有不匹配的文件名都将被忽略 我不可能使用两个选项“.csv/r”和“.csv”
我不可能使用两个选项“.csv/r”和“.csv”生成不同的行为。有人能给我举个例子,我可以看到“.csv/r”和“.csv”之间的区别吗?我似乎也不能让它做任何不同的事情。守则的有关部分如下:
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
现在,在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
子文件2表
{
我的($self,$meta,$file,$file\u是表,$respect\u case)=@;
$file eq“.”| |$file eq“.”并返回;#XXX将破坏可能的DBD::Dir
我的($ext,$req)=(“”,0);
如果($meta->{f_ext}){
($ext,my$opt)=拆分m/\/,$meta->{f_ext};
如果($ext&&$opt){
$opt=~m/r/i和$req=1;
}
}
#(my$tbl=$file)=~s/$ext$//i;
我的($tbl,$dir,$user\u spec\u file);
if($file_是表,定义为$meta->{f_file}){
$tbl=$file;
($file,$dir,unde)=file::Basename::fileparse($meta->{f_file});
$user\u spec\u file=1;
}
否则{
($tbl,$dir,unde)=文件::基本名称::文件解析($File,$ext);
$user\u spec\u file=0;
}
-d文件::Spec->catdir($meta->{f_dir},$dir)或
croak(File::Spec->catdir($meta->{f_dir},$dir)。“:$!”;
!$REPART_case和$meta->{sql_identifier_case}==1和#XXX sql_IC_UPPER
$tbl=uc$tbl;
!$REPART_case和$meta->{sql_identifier_case}==2和#XXX sql_IC_LOWER
$tbl=信用证$tbl;
我的$searchdir=File::Spec->File\u name\u是绝对的($dir)
?$dir
:Cwd::abs_路径(File::Spec->catdir($meta->{f_dir},$dir));
$searchdir eq$meta->{f_dir}和
$dir=“”;
除非($user\u spec\u file){
$file_是_表和$file=“$tbl$ext”;
#完全限定文件名
我的$cmpsub;
如果($尊重案例){
$cmpsub=sub{
my($fn,unde,$sfx)=文件::基本名称::文件解析($\uqr/\.[^.]*/);
$fn eq$tbl和
返回(lc$sfx eq lc$ext或!$req&&!$sfx);
返回0;
}
}
否则{
$cmpsub=sub{
my($fn,unde,$sfx)=文件::基本名称::文件解析($\uqr/\.[^.]*/);
信用证$fn eq信用证$tbl和
返回(lc$sfx eq lc$ext或!$req&&!$sfx);
返回0;
}
}
opendir my$dh、$searchdir或croak“无法打开“$searchdir”:$!”;
my@f=sort{length$b length$a}grep{&$cmpsub($))readdir$dh;
@f>0&@f{sql_identifier_case}==4和#XXX sql_IC_混合
($tbl=$file)=~s/$ext$//i;
closedir$dh或croak“无法关闭'$searchdir':$!”;
#(my$tdir=$dir)=~s{^\./}{};#XXX我们不希望所有表都以开头/
#$tdir和$tbl=文件::规范->catfile($tdir,$tbl);
$dir和$tbl=File::Spec->catfile($dir,$tbl);
my$tmpfn=$file;
如果($ext){
如果($req){
#需要文件扩展名
$tmpfn=~s/$ext$//i或return;
}
#否则{
##文件扩展名可选,如果存在扩展名为的文件,则跳过
#grep m/$ext$/i,glob“$fqfn.*”并返回;
#$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;
!已定义$meta->{f_lockfile}&&$meta->{f_lockfile}和
$meta->{f_fqln}=$meta->{f_fqbn}.$meta->{f_lockfile};
$meta->{table_name}=$tbl;
返回$tbl;
}#文件2表格
就我所见,两个f_ext-options的工作情况与预期一致。这是否说明了两者的区别 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 % 沙盒%echo“a、b、c”>foo 沙盒%echo“a、b、c”>foo.csv 沙盒%echo“a、b、c”>条 沙盒%echo“a、b、c”>baz.csv 沙盒%perl-MDBI-wle'print for DBI->connect(“DBI:CSV:f_ext=.CSV”)->tables' “merijn”,baz “merijn”酒吧 “merijn”,foo 沙盒%perl-MDBI-wle'print for DBI->connect(“DBI:CSV:f_ext=.CSV/r”)->tables' “merijn”,baz “merijn”,foo 沙箱%
f_ext=.csv
只将.csv
作为首选项,而不是要求:在第一种情况下,仍然使用没有.csv扩展名的文件“bar”,但选择“foo.csv”而不是“foo”。使用f_ext=.csv/r“
,“bar”被忽略,因为它没有“.csv”扩展名。如果“my@f=grep{lc$\ueq lc$file}readdir$dh;“-grep找不到文件?
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
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 %