2010-05-07 6 views
1

В этом скрипте у меня проблемы с расширением имени файла: , если я использую/home/mm/test_x, он работает с файлом с именем/home/mm/test_x .csv он не делает:DBD :: 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; 

Вывод с файловой именин:

расширением

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

Это ошибка?

кошка 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

ответ

3

DBD :: CSV обеспечивает способ отображения названия таблиц, которые вы используете в своих запросах к файлам. Тот же механизм используется для настройки атрибутов каждого файла, таких как завершение строки, разделитель полей и т. Д. Ищите «csv_tables» в документации DBD :: CSV.

#!/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).