DBD :: CSV: проблема с расширениями имени файла - PullRequest
1 голос
/ 07 мая 2010

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

Вывод с расширением имя-файла:

DBD :: CSV :: st ошибка выполнения:
Ошибка выполнения: Нет такого столбца '"/home/mm/test_1.csv".id 'вызывается из /usr/local/lib/perl5/site_perl/5.12.0/x86_64-linux/DBD/File.pm в 570.

Вывод без расширения имени файла:

'1', 'Браун', 'Ларами'
'2', 'Смит', 'Уотертаун'
2 строки

Является ли этоошибка?

кошка test_1.csv

идентификатор, имя
1, коричневый
2, смит
5, зеленый

cat test_2.csv

id, город
1, Ларами
2, Уотертаун
8, Спрингвилл

Ответы [ 3 ]

3 голосов
/ 08 мая 2010

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 голосов
/ 09 июля 2010

Думаю, вы захотите взглянуть на атрибуты f_ext и f_dir. Затем вы можете классифицировать имена таблиц как «test_1» и «test_2» без csv, но используемые файлы будут test_1.csv и test_2.csv. Проблема с точкой в ​​имени таблицы - это точка, которая обычно используется для отделения схемы от имени таблицы (см. F_schema).

0 голосов
/ 08 мая 2010

Похоже, даже это работает:

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