Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Считывание данных из Assess (помогите найти ошибку


Автор: CiH 22.1.2009, 18:15
Дого пытался узнать, как считать данные из MS Access. На форумах отвечали, типа, Win32::ODBC, а там всё просто. Но это "всё просто" никто обяснить не хотел. С английски я не в ладах. На русском документации нет. А то, что выдаёт переводчик, разве только Задорнову читать со сцены. Нашёл наконец образец кода, подстроил под себя.
Код

#!/usr/bin/perl -w
use Win32::ODBC;
$DSN="DSN=billing";
$dbh = new Win32::ODBC($DSN) || die "Error: " . Win32::ODBC::Error();
$dbh->Sql( "SELECT * FROM cdata" );
while($dbh->FetchRow()){  
  %h=$dbh->DataHash();
  $abc="$h{sqno}\t$h{type}\t$h{tdate}"; # Ну и в таком духе
  push (@a,$abc);
}
open(TTT, ">c:/billing/odbc.txt") || die "Îøèáêà îòêðûòèÿ ôàéëà cdata.txt: $!";              
print TTT @a; close(TTT);
$dbh->Close();


Скрин структуры таблицы в прикреплённом файле.
Мне не нужно ничего туда добавлять, убирать. Просто нужно считать данные и всё.

В базе, в таблице cdata есть куча записей, однако на выходе получаю пустой файл. Подскажите, пожалуйста, что тут неправильно. Только не забывайте, что новичок.

Автор: nitr 22.1.2009, 18:40
CiH, скрипт вроде верный, хотя и написан новичком (ну и в таком стиле тоже, сейчас немного иначе), но повторюсь - рабочий.

Автор: CiH 22.1.2009, 18:40
Ошибку нашёл.  smile  
Иногда чтобы найти ошибку, достаточно рассказать о ней другому.  smile 

Автор: nitr 22.1.2009, 18:44
вот такой код что выводит?
Код
#!/usr/bin/perl
use strict;
use warnings;

use Win32::ODBC;
use Data::Dumper 'Dumper';

my $DSN = "billing";
my $dbh = Win32::ODBC->new($DSN) || die "Error: " . Win32::ODBC::Error();

$dbh->Sql( "SELECT * FROM cdata" );
my @a;
while( $dbh->FetchRow() ) {
    my %h = $dbh->DataHash();
    push @a, {%h};
}
$dbh->Close();

print Dumper(@a);


Добавлено @ 18:45
CiH, и в чем ошибка?

Автор: ginnie 22.1.2009, 18:49
Извиняюсь за  smile 

nitr, почему

Код

push @a, {%h};


а не

Код

push @a, \%h;

Автор: CiH 22.1.2009, 19:05
Ошибка до смешного проста. Невнимательность.
Строка 5
            SELECT * FROM cdata
А таблица называется Cdata (с заглавной буквы)
Поменял, и заработало. Наверно это...

Хотя.... тот код, который ты привёл, выводит 
$VAR24081 = {
              'pport' => '',
              'cref' => '-1',
              'uport' => '    1066',
              'cport' => '   50300',
              'cdata' => '24179149',
              'rpuls' => '0',
              'sqno' => '24081',
              'info' => '0',
              'flags' => '16814624',
              'ppuls' => '1',
              'dlps' => '414656',
              'duration' => '54',
              'rdata' => '17091121111111',
              'xdata' => '',
              'type' => 'A',
              'tdate' => '2008-12-15 10:54:26'
            };
На каждую запись. Значит он таки видит данные. И видит верно. Ниччччииииво не понимаю. 

Автор: nitr 22.1.2009, 19:46
ginnie, привычка чтоб её... Кстати, ваша поправка в данном случае вернее - \%h.

CiH, может вы и в мой код автоматически вставили верное название таблицы?

Автор: ginnie 22.1.2009, 19:50
CiH, т.к. данных у Вас много, разумно вывод в файл делать внутри цикла получения данных, чтобы не сохранять все данные в массиве.

Автор: CiH 23.1.2009, 12:09
Цитата(nitr @  22.1.2009,  19:46 Найти цитируемый пост)
CiH, может вы и в мой код автоматически вставили верное название таблицы? 

Нет, специально проверил. Может прихоти Win2k?

Цитата(ginnie @  22.1.2009,  19:50 Найти цитируемый пост)
CiH, т.к. данных у Вас много, разумно вывод в файл делать внутри цикла получения данных, чтобы не сохранять все данные в массиве. 

В принципе, фай - это для контроля. Мне нужен массив для дальнейшей обработки. А вот на счёт данных, даже и не знаю что делать. В месяц будет, наверное до 40 000 записей. Это за год пол-миллиона....  А я пока умею только в тексте хранить. Может, посоветуете что? Если я вам ещё не надоел. Только не забывайте, плиз, что я Новичок (именно с большой буквы).


Автор: ginnie 23.1.2009, 12:26
CiH, чтобы посоветовать что-то дельное, надо понять что Вам нужно. Опишите, что Вам нужно сделать, а мы подскажем, как и не нужно стеснятся, мы здесь любим всем помогать, особенно новичкам!

Автор: CiH 23.1.2009, 13:11
Есть АТС. С него снимается биллинг. (кто куда когда звонил)
Написал небольшой скрипт, который считает стоимость звонков и т.д. Дальше всё записывается в текстовые файлы (общий + отдельно каждый номер) в формате Кто - Куда - стоимость - Когда. При необходимости вызываю подпрограмму, которая складывает стоимость звонков за кокой-либо период по каким-либо номерам. Сделано в виде менюшек под cmd (в tk мне лезть ещё рановато, учитывая полное отсутствие документации на русском, а с CGI позже покопаюсь). В принципе все более-менее сложные расчёты делаются на стадии считывания и добавления в "базу" smile .
И скорость приличная.
Но. Файл растёт не по дням а по часам (в месяц по 5-6 Mb). И я опасаюсь, что через пол года скорость подсчёта будет существенно замедлена.
С dbm попробовал - не подходит. Подсчёт должен проводиться как по номеру, так и по дате (в перспективе и по номеру назначения). 
Вот и думаю, что взять за основу?

Кстати, один вопрос, сколько дескрипторов одновременно можно открыть в винде 2000? 

Автор: ginnie 23.1.2009, 13:22
CiH, скажите, почему имея БД не использовать ее для решения этой задачи? Зачем хранить данные в текстовых файлах?

Автор: CiH 23.1.2009, 13:50
БД MS Access.
Скорость подсчёта за месяц. Access - 17 min. Perl - 19 sec.
Представь годовой отчёт  smile 
А считать приходится часто. Начальство лимиты выставило.

Автор: ginnie 23.1.2009, 13:53
Скорее всего, Вы неверно работаете с БД (возможно нет нужных индексов). Приведите запрос, который долго работает.

Автор: CiH 23.1.2009, 15:03
Код привести не могу, писал не я. Как я понял, долго сопоставляется исходящий звонок с кодом оператора и страны (их более 2000).

Автор: CiH 24.1.2009, 14:29
У скрипта есть один минус. Жёсткая привязка к имени файла. Не подскажете, можно ли это как-то исправить?

Автор: tishaishii 24.1.2009, 14:58
Рубить надо Access с большими объёмами и переходить на что-то более мощное. Есть такая СУБД MySQL, в отличие от БД Access.
Исправить...
Вызов:
Код
perl test.pl -output file.txt


Код

#test.pl

use Data::Dumper;
use locale;

my$args={@ARGV};
print Dumper $args;

die if $args->{'-output'}!~/\S/o || $args->{'-output'}=~/[^\w\Q-.@#()&%$!'\E]/o;

open O, '>'.$args->{'-output'};...

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)