2010-05-07 51 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)。