2010-05-07 50 views
1

在这个脚本中,如果我使用/ home/mm/test_x,文件名为/ home/mm/test_x,那么文件名扩展名有问题: 的.csv它并不:DBD :: CSV:文件扩展名存在问题

DBD::CSV::st execute failed:
Execution ERROR: No such column '"/home/mm/test_1.csv".id' called from /usr/local/lib/perl5/site_perl/5.12.0/x86_64-linux/DBD/File.pm at 570.

输出没有文件名扩展:

'1', 'Brown', 'Laramie'
'2', 'Smith', 'Watertown'
2 rows

#!/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; 

与文件名,extention输出这是一个错误?

猫test_1.csv

id,name
1,Brown
2,Smith
5,Green

猫test_2.csv

id,city
1,Laramie
2,Watertown
8,Springville

+0

你也可以提供csv文件中的示例数据。 – Space 2010-05-07 07:52:09

回答

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(); 

在我来说,我必须指定结束字符行,因为我创建的CSV文件,在vi让他们结束了与Unix行结尾,而DBD :: CSV假定DOS/Windows行结束符不管平台上运行该脚本。

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(); 
0

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