Модераторы: korob2001, ginnie

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Считывание данных из Assess (помогите найти ошибку, Не ругайте меня, я новичок в Perl 
:(
    Опции темы
CiH
Дата 22.1.2009, 18:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.12.2008

Репутация: нет
Всего: нет



Дого пытался узнать, как считать данные из 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 есть куча записей, однако на выходе получаю пустой файл. Подскажите, пожалуйста, что тут неправильно. Только не забывайте, что новичок.


Присоединённый файл ( Кол-во скачиваний: 11 )
Присоединённый файл  123.jpg 24,65 Kb
PM MAIL   Вверх
nitr
Дата 22.1.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



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


--------------------
PM   Вверх
CiH
Дата 22.1.2009, 18:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.12.2008

Репутация: нет
Всего: нет



Ошибку нашёл.  smile  
Иногда чтобы найти ошибку, достаточно рассказать о ней другому.  smile 
PM MAIL   Вверх
nitr
Дата 22.1.2009, 18:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



вот такой код что выводит?
Код
#!/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, и в чем ошибка?

Это сообщение отредактировал(а) nitr - 22.1.2009, 18:45


--------------------
PM   Вверх
ginnie
Дата 22.1.2009, 18:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



Извиняюсь за  smile 

nitr, почему

Код

push @a, {%h};


а не

Код

push @a, \%h;



--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
CiH
Дата 22.1.2009, 19:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.12.2008

Репутация: нет
Всего: нет



Ошибка до смешного проста. Невнимательность.
Строка 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'
            };
На каждую запись. Значит он таки видит данные. И видит верно. Ниччччииииво не понимаю. 

Это сообщение отредактировал(а) CiH - 22.1.2009, 19:19
PM MAIL   Вверх
nitr
Дата 22.1.2009, 19:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Участник Клуба
Сообщений: 2543
Регистрация: 10.2.2006
Где: Россия :)

Репутация: 37
Всего: 84



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

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


--------------------
PM   Вверх
ginnie
Дата 22.1.2009, 19:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
CiH
Дата 23.1.2009, 12:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.12.2008

Репутация: нет
Всего: нет



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

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

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

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



Это сообщение отредактировал(а) CiH - 23.1.2009, 12:19
PM MAIL   Вверх
ginnie
Дата 23.1.2009, 12:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
CiH
Дата 23.1.2009, 13:11 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.12.2008

Репутация: нет
Всего: нет



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

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

Это сообщение отредактировал(а) CiH - 23.1.2009, 13:12
PM MAIL   Вверх
ginnie
Дата 23.1.2009, 13:22 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
CiH
Дата 23.1.2009, 13:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.12.2008

Репутация: нет
Всего: нет



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

Это сообщение отредактировал(а) CiH - 23.1.2009, 13:52
PM MAIL   Вверх
ginnie
Дата 23.1.2009, 13:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Комодератор
Сообщений: 1287
Регистрация: 6.1.2008
Где: Москва

Репутация: 38
Всего: 49



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


--------------------
Написать код, понятный компьютеру, может каждый, но только хорошие программисты пишут код, понятный людям. (Мартин Фаулер. Рефакторинг)
PM MAIL Skype Jabber   Вверх
CiH
Дата 23.1.2009, 15:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 12
Регистрация: 13.12.2008

Репутация: нет
Всего: нет



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


Это сообщение отредактировал(а) CiH - 23.1.2009, 15:04
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Perl"
korob2001
sharq
  • В этом разделе обсуждаются общие вопросы по языку Perl
  • Если ваш вопрос относится к системному программированию, задавайте его здесь
  • Если ваш вопрос относится к CGI программированию, задавайте его здесь
  • Интерпретатор Perl можно скачать здесь ActiveState, O'REILLY, The source for Perl
  • Справочное руководство "Установка perl-модулей", можно скачать здесь


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, korob2001, sharq.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Perl: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0963 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.