Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: dbf  (Прочитано 23753 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Mayor
Специалист

ru
Offline Offline

dbf
« : 02-12-2007 19:49 » 

dbf

нужно обработать dbf файл: смахивает на таблицу звонков размером 9 метров

обработать желательно на перле, требуется расчитать количество шлюзов при котором остаточные звонки на гтс будут по стоимости меньше шлюза

где найти описание формата dbf?

кто и зачем изобрел этот формат?

есть ли готовый модуль на перле для работы с ним?

насколько сложно подключить модуль к перлу?
Записан

1n c0de we trust
Finch
Спокойный
Администратор

il
Offline Offline
Пол: Мужской
Пролетал мимо


« Ответ #1 : 02-12-2007 20:07 » 

Научись пользоваться Google. Полезная штука в поиске инфы. Вот справка по формату с Wiki http://en.wikipedia.org/wiki/DBASE
Цитата
Starting in the mid 1980s many other companies produced their own dialects or variations on the product and language. These included FoxPro (now Visual FoxPro), Arago, Force, dbFast, dbXL, Quicksilver, Clipper, Xbase++, FlagShip, Recital Terminal Developer, CodeBase, MultiBase and Harbour/XHarbour. Together these are informally referred to as xBase.

dBase's underlying file format, the .dbf file, is widely used in many other applications needing a simple format to store structured data.

Цитата
dBase can access most modern database engines via ODBC drivers.

http://dbi.perl.org/
« Последнее редактирование: 02-12-2007 20:19 от Finch » Записан

Не будите спашяго дракона.
             Джаффар (Коша)
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #2 : 02-12-2007 20:26 » 

если требуется доступ к файлу, только монопольно, то, поняв ЗАГОЛОВОК dbf файла, можно даже не использовать database engines via ODBC drivers, потому что, по своей сути это текстовый файл.

Mayor1,  Finch прав, большая часть ответов на твои простейшие вопросы в этом непонятном слове INTERNET.
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #3 : 02-12-2007 20:41 » 

Mayor1, посмотри статейку: http://www.opennet.ru/base/dev/dbf_perl.txt.html
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mayor
Специалист

ru
Offline Offline

« Ответ #4 : 03-12-2007 13:44 » 

http://dbi.perl.org/ - тут ничего не понял, слишком абстрактно ...

http://en.wikipedia.org/wiki/DBASE хорошее описание изобретения формата, + есть ссылка на описание формата

http://www.opennet.ru/base/dev/dbf_perl.txt.html  к сожалению я еще не научился пользоваться модулями, + тоже есть ссылка на описание формата dbf

как я понял, проще обработать хиадер вручную учитывая простоту формата файла ... как считать в переменную определенное число байт из файла перлом? ( до этого только считывал строки целиком )

Записан

1n c0de we trust
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 03-12-2007 13:49 » 

Mayor1, зачем делать вручную, если есть модуль? DBI - стандартный для Perl интерфейс к базам. Нужно только установить DBD модуль под нужную базу. Опять таки - работа через SQL.

http://search.cpan.org/~janpaz/DBD-XBase-0.241/lib/DBD/XBase.pm

Если чего не понятно по модулю - спрашивай.
« Последнее редактирование: 03-12-2007 13:53 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #6 : 03-12-2007 14:52 » 

Offtopic:
стояла задача "распарсить"  dbf-ник, приблизительно для тех же задач, что стоят у Mayor1, разными  штатными средствами получалось - около 2-4 часов обработки, в зависимости от средств.
Потом, зная что формат файла неизменный, его обработали - результат, 20 минут. Согласен - топорная работа.
Поставлю в угол.

Првильно - штатными средствами
Быстро - прямой доступ
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
Mayor
Специалист

ru
Offline Offline

« Ответ #7 : 03-12-2007 15:09 » 

Mayor1, зачем делать вручную, если есть модуль? DBI - стандартный для Perl интерфейс к базам. Нужно только установить DBD модуль под нужную базу. Опять таки - работа через SQL.

http://search.cpan.org/~janpaz/DBD-XBase-0.241/lib/DBD/XBase.pm

Если чего не понятно по модулю - спрашивай.

зы Улыбаюсь пока что ничего не понятно  ...

хм проблемма в том, что нет никакой базы данных, есть лог телефонных звонков, записанный микроконтроллером атс в файл размером 9 мб, по идее его нужно будет считать в ассоциативные хеши арреев, либо в аррей арреев, потом отсортировать и обработать, хеадер дбф файла составляет менее 800 байтов и его формат полностью документирован, единственное что меня щас останавливает -- это то что я на перле работал только со строками ...

имхо изучение работы на перле с файлами займет менее 2х часов + практика
с дби я проплюхаюсь не один день Жаль

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

Offtopic:
стояла задача "распарсить"  dbf-ник, приблизительно для тех же задач, что стоят у Mayor1, разными  штатными средствами получалось - около 2-4 часов обработки, в зависимости от средств.
Потом, зная что формат файла неизменный, его обработали - результат, 20 минут. Согласен - топорная работа.
Поставлю в угол.

Првильно - штатными средствами
Быстро - прямой доступ

 а хотя, учитывая практический опыт Славайя, по твоей ссылке есть пример превращающий дбф файл в простой текстовый файл ... похоже имеет смысл попариться  часок с установкой xbase, может так будет даже быстрее, Жаль лишь бы не вышло как с дебианским мод перлом - установилось на ура, а потом 1.5 дня не мог запустить простой серверный скрипт
Записан

1n c0de we trust
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 03-12-2007 16:49 » 

Mayor1, медленно получается потому, что ты плохо читаешь документацию - последние твои темы говорят об этом. Я тебе даже ссылку с примером привел и полным описанием модуля. Неужели трудно прочесть?

Специально для тебя перевожу на русский язык:
Код: (Perl)
1     use DBI;
2     my $dbh = DBI->connect("DBI:XBase:/directory/subdir")
3                                 or die $DBI::errstr;
4     my $sth = $dbh->prepare("select MSG from test where ID != 1")
5                                 or die $dbh->errstr();
6     $sth->execute() or die $sth->errstr();
7
8     my @data;
9     while (@data = $sth->fetchrow_array())
10                { ## further processing }
11
12    $dbh->do('update table set name = ? where id = 45', {}, 'krtek');

1. Грузим модуль.
2. Создаем подключение к базе. Путь "/directory/subdir" тут означает директорию, в которой лежат dbf-файлы. Каждый файл считается одной таблицей. Создание новой таблицы приведет к появлению новго dbf-файла.
4. Подготавливаем SQL-запрос к выполнению.
6. Выполняем запрос.
9. Считываем результат построчно. Метод fetchrow_array возвращает строку в виде массива значений.
12. Пример обновления записи в базе.

Драйвер не создает индексных файлов. Заполнение базы новыми записями будет происходить также быстро, как если напрямую писать в файл. Если в будующем нужно будет выполнять поиск, то полезны будут индексы. Читаем: "check XBase(3) for notes about support for variour index types".

Описание интерфейса: man DBI



Кстати, если у тебя нет этого dbf, то возникает резонный вопрос: а нужен ли он, или сгодится любая другая база? Почему именно dbf?
« Последнее редактирование: 03-12-2007 16:53 от RXL » Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mayor
Специалист

ru
Offline Offline

« Ответ #9 : 04-12-2007 10:59 » 

да мне пока никакая база не нужна, есть файл dbf в который пишет контроллер атс, на первый взгляд формат похож на тот, на который ссылается википедия

отностительно use DBI; получается тоже самое, что и с XBASE : could not find *.pm in @INC, я так понял, что для начала мне нада почитать на perldoc.perl.org немного про создание, загрузку и подключение модулей ... с сис реадом я думаю седня еще не буду париться учитывая твой и Славайский положительный опыт работы с дбай и хбайз, все должно решиться штатными методами входящими в состав cpan
Записан

1n c0de we trust
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #10 : 04-12-2007 14:22 » 

Mayor1, бррррррр........

1. скачай дистрибутив модуля
2. в нем найдешь файл INSTALL - читай внимательно

Цитата
никакая база не нужна, есть файл dbf в который пишет контроллер атс
Цитата
нет никакой базы данных, есть лог телефонных звонков, записанный микроконтроллером атс в файл

Определись с тем, что у тебя есть: сам не путайся и не путай людей.  Здесь вам не тут!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Dimka
Деятель
Команда клуба

ru
Offline Offline
Пол: Мужской

« Ответ #11 : 05-12-2007 09:22 » 

Сколь я помню, в стародавние времена dbf файлы в терминах FoxPro/dBase именовались базами данных, которые становились активными при загрузке их в одну из 10 рабочих областей. Затем понятия изменились, dbf стали называться таблицами, а их совокупность - базой данных  Еще давным давно....

Поскольку есть 1 dbf-файл, то он одновременно является и простой таблицей (Mayor1 прав), и базой данных, состоящей из этой одной таблицы (RXL прав).

Но если Mayor1 всё же соберётся использовать библиотеку доступа к данным, то ему придётся следовать терминологии, принятой для этой библиотеки  RTFM. У всех современных библиотек подключение производится к СУБД или к базе данных, как бы там кто не утверждал, что ему "никакая база данных не нужна". И только в рамках базы данных можно работать с таблицей.
Записан

Программировать - значит понимать (К. Нюгард)
Невывернутое лучше, чем вправленное (М. Аврелий)
Многие готовы скорее умереть, чем подумать (Б. Рассел)
Mayor
Специалист

ru
Offline Offline

« Ответ #12 : 16-12-2007 17:19 » 

удалось прочитать dbf через xbase, с dbi пока связываться не стал...

Код:
#!/usr/bin/perl 

use Xbase;
use strict;
my ($dbf_name,$idx_name);
$dbf_name="calls.dbf";
my $database = new Xbase;
$database->open_dbf($dbf_name, $idx_name);
print $database->dbf_type . " type \n";
print $database->last_update . " last update \n";
print $database->lastrec . " last record \n";
print $database->dbf_stat . " status \n";
until ($database->eof) {
my $current_rec=$database->recno;
print $current_rec . " --> ";
my @fields = $database->get_record;
print join " ::",@fields;
print "\n";
$database->go_next;
};
$database->close_dbf;

выдает что-то типа:
FoxBase+/dBase III Plus/Foxpro/dBase IV, no memo type
6/1/7 last update
61242 last record
No. Field     Type  Disp  Len  Dec
  1 DAT          D     1    8    0
  2 C            C     9    6    0
  3 TRUNKGROU    C    15    4    0
  4 EXTENSIO     C    19    6    0
  5 ACCOUN       C    25    6    0
  6 NUMBE        C    31   35    0
  7 TENAN        C    66    1    0
  8 TRANSFE      C    67    1    0
  9 PRIC         N    68    9    3
 10 STATU        C    77   20    0
 11 IDURATIO     N    97    5    0
 12 ITIM         N   102    5    0
 13 HAN          C   107    1    0
 14 CALLTYP      C   108    1    0
 15 TRFGROU      N   109    1    0
 16 ZONEI        N   110    6    0
 17 CURRENCYI    N   116    1    0
 18 PREFLEN      N   117    2    0
 19 PREFLEN      N   119    2    0
 20 METERPULS    N   121    8    2
 21 RINGBEFOR    N   129    3    0
 22 CALLERI      C   132   16    0
 23 CALLMOD      C   148    2    0
 status
1 --> 20070502 :: :: ::57723 :: ::internal-57722 :: :: ::    0.000 ::é¡πΓαÑ¡¡¿⌐ ::   21 ::31591 :: ::N ::0 ::     0 ::0 :: 0 :: 0 ::    0.00 ::  0 :: ::1
2 --> 20070502 :: :: ::57600 :: ::internal-57811 :: :: ::    0.000 ::é¡πΓαÑ¡¡¿⌐ ::   77 ::31541 :: ::N ::0 ::     0 ::0 :: 0 :: 0 ::    0.00 ::  0 :: ::1
3 --> 20070502 ::0011 :: ::57744 :: ::8909xxxxxxx :: :: ::    0.000 ::¡Ñ¿ºó.¬«ñ ú«α«ñá ::   35 ::31604 :: ::E ::0 ::     0 ::0 :: 0 :: 0 ::    0.00 ::  0 :: ::3
4 --> 20070502 :: :: ::57704 :: ::internal-57613 :: :: ::    0.000 ::é¡πΓαÑ¡¡¿⌐ ::   10 ::31642 :: ::N ::0 ::     0 ::0 :: 0 :: 0 ::    0.00 ::  0 :: ::1
5 --> 20070502 :: :: ::57642 :: ::internal-57609 :: :: ::    0.000 ::é¡πΓαÑ¡¡¿⌐ ::   12 ::31644 :: ::N ::0 ::     0 ::0 :: 0 :: 0 ::    0.00 ::  0 :: ::1
6 --> 20070502 :: :: ::57503 :: ::internal-57644 :: :: ::    0.000 ::é¡πΓαÑ¡¡¿⌐ ::   16 ::31650 :: ::N ::0 ::     0 ::0 :: 0 :: 0 ::    0.00 ::  0 :: ::1
7 --> 20070502 :: :: ::57763 :: ::internal-57793 :: :: ::    0.000 ::é¡πΓαÑ¡¡¿⌐ ::   51 ::31627 :: ::N ::0 ::     0 ::0 :: 0 :: 0 ::    0.00 ::  0 :: ::1

1 - число
4 - внутренний номер
6 - внешний\внутренний номер
9 - цена как-то криво посчитана или я что то в формате не понимаю
11 - продолжительность в секундах
12 - время суток в секундах

совсем не понял, как входящие от исходящих отличить Жаль
у кого нить есть атс с подобными логами? что могут остальные поля означать?

тестовый файл 10 мб 62к записей обработало раз в 50 медленней чем на С - за 15 сек, но на то он и перл ...
по идее нада будет обработать 1-1.5 миллиона звонков (объем 100-150 мб ) если не выскочу за пределы линейного времени выполнения алгоритмов - то должен уложиться в 3-5 минут

есть идее как отсечь звонки на сотовые по области от остальных звонков?
Записан

1n c0de we trust
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 16-12-2007 18:37 » 

Цитата
совсем не понял, как входящие от исходящих отличить

Выложи еще запись для входящего звонка.
Пока ясно, что отделить внутренние от внешних можно по полям "CALLTYP" и "NUMBE". Кстати, что значит поле "C" - нет догадок?

Кстати, все имена полей без одной буквы - что-то дурит.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Sla
Команда клуба

ua
Offline Offline
Пол: Мужской

WWW
« Ответ #14 : 16-12-2007 20:13 » 

я просто промолчу Улыбаюсь
моему сименсу можно сказать что логировать (входящие и исходящие), думаю что и твоему PBX тоже можно это сказать
но % на 80 уверен, что PBX отдает инфу не в dbf формате

тебе dbf отдает тарификатор
Записан

Мы все учились понемногу... Чему-нибудь и как-нибудь.
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #15 : 17-12-2007 08:30 » 

WinTarif какой-нибудь?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Mayor
Специалист

ru
Offline Offline

« Ответ #16 : 17-12-2007 14:32 » 

хм в натуре я возножность pbx переоценил ...

пошел доки по винтариф читать ...

кстати, есть что нить типа винтариф с открытыми исходниками?
Записан

1n c0de we trust
RXL
Технический
Администратор

Offline Offline
Пол: Мужской

WWW
« Ответ #17 : 17-12-2007 17:56 » new

Mayor1, винтариф ничем интересным не отличается - это очень ограниченный продукт - по своему опыту говорю. Суть его в том, что под каждую АТС делается модуль, преобразующий ее логи в базу wintarif-а и все обсчеты делаются общим для всех АТС модулем.
Я тогда работал с Nortel Meridian1 и скажу, что wintarif мог обрабатывать только самый примитив типа прямых звонков, но на практике бывают всякие трансферы, переадресации, конфы, очереди и т.п., а это ему не по зубам, да и в плане обработки номеров у него не блестящие способности. Приходилось делать предварительную обработку, чтобы потом было легче обсчитывать, а статистику по очередям и т.п. все равно пришлось собственными программами обсчитывать.
Порой лучше исходный лог АТС обрабатывать - точнее будет.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines