DBD :: CSV:文件名扩展名出现问题

时间:2010-05-07 06:52:13

标签: perl csv dbi filenames dbd

在这个脚本中,我遇到了文件名扩展的问题: 如果我使用/ home / mm / test_x它可以工作,文件名为/home/mm/test_x.csv它不会:

#!/usr/bin/env perl
use warnings; use strict;
use 5.012;
use DBI;

my $table_1 = '/home/mm/test_1.csv';
my $table_2 = '/home/mm/test_2.csv';
#$table_1 = '/home/mm/test_1';
#$table_2 = '/home/mm/test_2';

my $dbh = DBI->connect( "DBI:CSV:" );
$dbh->{RaiseError} = 1;

$table_1 = $dbh->quote_identifier( $table_1 );
$table_2 = $dbh->quote_identifier( $table_2 );

my $sth = $dbh->prepare( "SELECT a.id, a.name, b.city FROM $table_1 AS a NATURAL JOIN $table_2 AS b" );

$sth->execute;
$sth->dump_results;
$dbh->disconnect;

使用file-name-extention输出:

  

DBD :: CSV :: st执行失败:
  执行错误:在570,从/usr/local/lib/perl5/site_perl/5.12.0/x86_64-linux/DBD/File.pm调用此类列“/home/mm/test_1.csv".id”。 / p>

没有文件名扩展名的输出:

  

'1','布朗','拉勒米'   '2','史密斯','水城'   2行

这是一个错误吗?

cat test_1.csv

  

ID,名称
  1,布朗
  2,史密斯
  5,绿色

cat test_2.csv

  

ID,城市
  1,拉勒米
  2,水城
  8,斯普林维尔

3 个答案:

答案 0 :(得分:3)

DBD :: CSV提供了一种将查询中使用的表名映射到文件名的方法。相同的机制用于设置每行文件属性,如行结尾,字段分隔符等。在DBD :: CSV文档中查找“csv_tables”。

#!/usr/bin/env perl

use warnings;
use strict;

use DBI;

my $dbh = DBI->connect("DBI:CSV:f_dir=/home/mm", { RaiseError => 1 });
$dbh->{csv_tables}->{table_1} = {
    'file' => 'test_1.csv',
    'eol' => "\n",
};
$dbh->{csv_tables}->{table_2} = {
    'file' => 'test_2.csv',
    'eol' => "\n",
};

my $sth = $dbh->prepare( "SELECT a.id, a.name, b.city FROM table_1 AS a NATURAL JOIN table_2 AS b" );

$sth->execute();
$sth->dump_results();
$dbh->disconnect();

在我的情况下,我必须指定一个行结束字符,因为我在vi中创建了CSV文件,所以他们最终得到了Unix行结尾,而DBD :: CSV假定DOS / Windows行结尾,无论脚本是什么平台继续。

答案 1 :(得分:0)

我看起来甚至可行:

#!/usr/bin/env perl
use warnings; use strict;
use 5.012;
use DBI;

my $dbh = DBI->connect("DBI:CSV:f_dir=/home/mm/Dokumente", undef, undef, { RaiseError => 1, });

my $table = 'new.csv';
$dbh->do( "DROP TABLE IF EXISTS $table" );
$dbh->do( "CREATE TABLE $table ( id INT, name CHAR(64), city CHAR(64) )" );
my $sth_new = $dbh->prepare( "INSERT INTO $table( id, name, city ) VALUES ( ?, ?, ? )" );

$dbh->{csv_tables}->{table_1} = { 'file' => '/tmp/test_1.csv', 'eol' => "\n", };
$dbh->{csv_tables}->{table_2} = { 'file' => '/tmp/test_2.csv', 'eol' => "\n", };
my $sth_old = $dbh->prepare( "SELECT a.id, a.name, b.city FROM table_1 AS a NATURAL JOIN table_2 AS b" );
$sth_old->execute();

while ( my $hash_ref = $sth_old->fetchrow_hashref() ) {
    state $count = 1;
    $sth_new->execute( $count++, $hash_ref->{'a.name'}, $hash_ref->{'b.city'} );
}
$dbh->disconnect();

答案 2 :(得分:0)

我想你可能想看看f_ext和f_dir属性。然后,您可以将表名称分类为“test_1”和“test_2”而不使用csv,但使用的文件将是test_1.csv和test_2.csv。表名中带点的问题是点通常用于将模式与表名分开(请参阅f_schema)。