2010-05-07 18 views
1

Dans ce script, j'ai des problèmes avec les extensions de noms de fichiers: si j'utilise/home/mm/test_x cela fonctionne, avec le fichier nommé/home/mm/test_x .csv il n'a pas:DBD :: CSV: Problème avec les extensions de nom de fichier

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

sortie avec nom-fichier-extention:

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.

sortie sans nom de fichier d'extension:

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

Est-ce un bug?

chat test_1.csv

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

chat test_2.csv

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

+0

Pouvez-vous également donner des exemples de données dans des fichiers CSV. – Space

Répondre

3

DBD :: CSV fournit un moyen de cartographier les noms de table que vous utilisez dans vos requêtes aux noms de fichiers. Le même mécanisme est utilisé pour configurer les attributs par fichier comme la fin de ligne, le séparateur de champs, etc. recherchez 'csv_tables' dans la documentation de 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(); 

Dans mon cas, je devais indiquer une fin de ligne caractère, parce que je créé les fichiers CSV dans vi alors ils ont fini avec les fins de ligne Unix alors que DBD :: CSV prend fins de ligne DOS/Windows quelle que soit la plate-forme le script est exécuté.

0

Je ressemble même cela fonctionne:

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

Je pense que vous pouvez jeter un oeil à la f_ext et les attributs f_dir. Vous pouvez ensuite classer vos noms de table comme "test_1" et "test_2" sans le csv mais les fichiers utilisés seront test_1.csv et test_2.csv. Le problème avec un point dans le nom de la table est qu'un point est généralement utilisé pour séparer le schéma du nom de la table (voir f_schema).