Wine и телефонный справочник

Технические обсуждения
Аватара пользователя
antichrist
Full Member
Full Member
Сообщения: 248
Зарегистрирован: 19 апр 2008 17:05
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение antichrist »

АПП писал(а):Уже вполне можно пользоваться. Теперь осталось взять базу 2007 года и конвертировать её в формат sqlite.

Изображение
Ну давай, как - нить перресечмся, я тебе базу, а ты расскажешь, как твоей утилиткой пользоваться!

Аватара пользователя
АПП
Full Member
Full Member
Сообщения: 212
Зарегистрирован: 02 май 2008 15:39
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение АПП »

antichrist писал(а):Ну давай, как - нить перресечмся, я тебе базу, а ты расскажешь, как твоей утилиткой пользоваться!
Сможешь ко мне на работу (на Нерчинскую) на неделе подойти, передать диск с базой?
Mandriva 2009.1 (desktop) / CentOS 5.1 (server)
Core 2 Duo E8400 / 4 Gb RAM / ASUS P5K / ASUS ENGTS250
Core 2 Duo E8200 / 2 Gb RAM / ECS G31T-M7 / ASUS EAH4850
Core 2 Duo E6550 / 2 Gb RAM / ASUS P5K SE / ASUS EAH2600XT

Аватара пользователя
antichrist
Full Member
Full Member
Сообщения: 248
Зарегистрирован: 19 апр 2008 17:05
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение antichrist »

АПП писал(а):
antichrist писал(а):Ну давай, как - нить перресечмся, я тебе базу, а ты расскажешь, как твоей утилиткой пользоваться!
Сможешь ко мне на работу (на Нерчинскую) на неделе подойти, передать диск с базой?
Ну давай, как соберусь, тебе в личку сообщу! Кажись у меня остался твой алрес.

Аватара пользователя
АПП
Full Member
Full Member
Сообщения: 212
Зарегистрирован: 02 май 2008 15:39
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение АПП »

antichrist писал(а):Ну давай, как соберусь, тебе в личку сообщу! Кажись у меня остался твой алрес.
Договорились. И по возможности захвати с собой флэшку, чтобы матрицу не тратить, - сразу конвертируем базу 2007 года в формат sqlite и немного приведём её в порядок.
Mandriva 2009.1 (desktop) / CentOS 5.1 (server)
Core 2 Duo E8400 / 4 Gb RAM / ASUS P5K / ASUS ENGTS250
Core 2 Duo E8200 / 2 Gb RAM / ECS G31T-M7 / ASUS EAH4850
Core 2 Duo E6550 / 2 Gb RAM / ASUS P5K SE / ASUS EAH2600XT

Аватара пользователя
antichrist
Full Member
Full Member
Сообщения: 248
Зарегистрирован: 19 апр 2008 17:05
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение antichrist »

АПП писал(а):
antichrist писал(а):Ну давай, как соберусь, тебе в личку сообщу! Кажись у меня остался твой алрес.
Договорились. И по возможности захвати с собой флэшку, чтобы матрицу не тратить, - сразу конвертируем базу 2007 года в формат sqlite и немного приведём её в порядок.
Ok

Аватара пользователя
АПП
Full Member
Full Member
Сообщения: 212
Зарегистрирован: 02 май 2008 15:39
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение АПП »

Прикрутил базу 2007 года к оболочке. Всё работает.

Размер архива - 110 мегов. Кому нужна ссылка - пишите в личку (но если модератор не против, то выложу ссылку в эту тему).

В архиве два файла:
1. phones2007.db (база)
2. telbase.py (программа)

Для запуска необходимы:
1. QT4
2. python
3. libsqlite3
4. python-qt4
5. python-sqlite2 (в Мандриве пакет называется именно так, хотя в описании говорится: "python bindings for sqlite3")

Перед запуском программы необходимо изменить значение переменной pathtobase - указать путь к базе. По умолчанию поиск идёт по точному совпадению. Для неточного совпадения надо использовать *. Например, если в поле "Номер" набрать 4232* - будут показаны все городские номера Владивостока.
Mandriva 2009.1 (desktop) / CentOS 5.1 (server)
Core 2 Duo E8400 / 4 Gb RAM / ASUS P5K / ASUS ENGTS250
Core 2 Duo E8200 / 2 Gb RAM / ECS G31T-M7 / ASUS EAH4850
Core 2 Duo E6550 / 2 Gb RAM / ASUS P5K SE / ASUS EAH2600XT

Аватара пользователя
hatred
Global Moderator
Global Moderator
Сообщения: 1205
Зарегистрирован: 08 июн 2006 00:32
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение hatred »

Давай саму прогу разместим здесь, можно и ссылку, а база уже как бы, варез, так что через личку автору... ну можно как бы торрент сделать ;)
Прошли времена когда на элементарные вопросы можно было отвечать man <что-то там> (с) из сети
Hatred's Log Place | My GitHub repos | My Gitlab repos

Аватара пользователя
АПП
Full Member
Full Member
Сообщения: 212
Зарегистрирован: 02 май 2008 15:39
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение АПП »

hatred писал(а):Давай саму прогу разместим здесь

Код: Выделить всё

#!/usr/bin/env python
# coding=utf8
#28.09.2008

import sys
from PyQt4 import QtGui
from PyQt4 import QtCore
from pysqlite2 import dbapi2 as sqlite
pathtobase = "/home/vuohi/soft/tel2007/phones2007.db"

class MainWindow(QtGui.QMainWindow):
  def __init__(self, parent=None):
    QtGui.QMainWindow.__init__(self, parent)
    self.setWindowTitle(u'Телефонный справочник Владивостока')
    self.statusBar().showMessage(u'Найдено записей: ')
    numberLabel = QtGui.QLabel(u'Номер')
    ownerLabel = QtGui.QLabel(u'Владелец')
    streetLabel = QtGui.QLabel(u'Улица')
    houseLabel = QtGui.QLabel(u'Дом')
    flatLabel = QtGui.QLabel(u'Квартира')
    self.search = QtGui.QPushButton(u'Поиск')
    self.numberEdit = QtGui.QLineEdit()
    self.ownerEdit = QtGui.QLineEdit()
    self.streetEdit = QtGui.QLineEdit()
    self.houseEdit = QtGui.QLineEdit()
    self.flatEdit = QtGui.QLineEdit()
    spacerItem = QtGui.QSpacerItem(200,100,QtGui.QSizePolicy.Expanding,QtGui.QSizePolicy.Minimum)
    spacerItem1 = QtGui.QSpacerItem(50,100,QtGui.QSizePolicy.Fixed)
    spacerItem2 = QtGui.QSpacerItem(100,20,QtGui.QSizePolicy.Fixed)
    spacerItem3 = QtGui.QSpacerItem(50,20,QtGui.QSizePolicy.Fixed)
    spacerItem4 = QtGui.QSpacerItem(100,20,QtGui.QSizePolicy.Fixed)
    self.headers = [u'Номер', u'Владелец', u'Улица', u'Дом', u'Квартира']
    results = [('', '', '', '', '')]
    tablemodel = MyTableModel(results, self.headers, self)
    self.resultTable = QtGui.QTableView()
    self.resultTable.setModel(tablemodel)
    self.resultTable.setColumnWidth(0, 100)
    self.resultTable.setColumnWidth(1, 200)
    self.resultTable.setColumnWidth(2, 200)
    self.resultTable.setColumnWidth(3, 70)
    self.resultTable.setColumnWidth(4, 70)    
    self.resultTable.setSelectionBehavior(QtGui.QAbstractItemView.SelectRows)
    grid = QtGui.QGridLayout()
    grid.setSpacing(10)
    grid.addWidget(numberLabel, 1, 0)
    grid.addWidget(self.numberEdit, 1, 1, 1, 3)
    grid.addWidget(ownerLabel, 2, 0)
    grid.addWidget(self.ownerEdit, 2, 1, 1, 3)
    grid.addWidget(streetLabel, 3, 0)
    grid.addWidget(self.streetEdit, 3, 1, 1, 3)
    grid.addWidget(houseLabel, 4, 0)
    grid.addWidget(self.houseEdit, 4, 1)
    grid.addWidget(flatLabel, 4, 2)
    grid.addWidget(self.flatEdit, 4, 3)
    grid.addWidget(self.search, 5, 3)
    grid.addItem(spacerItem, 1, 4, 5, 1)
    grid.addItem(spacerItem1, 1, 0, 5, 1)
    grid.addItem(spacerItem2, 4, 1, 1, 1)
    grid.addItem(spacerItem3, 4, 2, 1, 1)
    grid.addItem(spacerItem4, 4, 3, 1, 1)
    grid.addWidget(self.resultTable, 6, 0, 1, 5)
    self.centralWidget = QtGui.QWidget() 
    self.setCentralWidget(self.centralWidget) 
    self.centralWidget.setLayout(grid)
    self.resize(800, 600)
    self.connect(self.search, QtCore.SIGNAL("clicked()"), self.dosearch)
    
  def dosearch(self):
    self.search.setEnabled(False)
    self.statusBar().showMessage(u'Выполняется поиск...')
    con = sqlite.connect(pathtobase)
    cur = con.cursor()
    number = fixstring(unicode(self.numberEdit.text()))
    owner = fixstring(unicode(self.ownerEdit.text()).lower())
    street = fixstring(unicode(self.streetEdit.text()).lower())
    house = fixstring(unicode(self.houseEdit.text()).lower())
    flat = fixstring(unicode(self.flatEdit.text()).lower())
    querystring = ""
    if stringnotempty(number):
      querystring = "number like '" + number + "'"
    if stringnotempty(owner):
      if not querystring:
        querystring = "owner like '" + owner + "'"
      else:
        querystring = querystring + "and owner like '" + owner + "'"
    if stringnotempty(street):
      if not querystring:
        querystring = "street like '" + street + "'"
      else:
        querystring = querystring + "and street like '" + street + "'"
    if stringnotempty(house):
      if not querystring:
        querystring = "house like '" + house + "'"
      else:
        querystring = querystring + "and house like '" + house + "'"
    if stringnotempty(flat):
      if not querystring:
        querystring = "flat like '" + flat + "'"
      else:
        querystring = querystring + "and flat like '" + flat + "'"
    if querystring:
      select = "select * from phones where " + querystring + " order by number"
      cur.execute(select)
      results = cur.fetchall()
      self.statusBar().showMessage(u'Найдено записей: %s' % len(results))
      if not results:
        results = [('', '', '', '', '')]
    else:
      results = [('', '', '', '', '')]
      self.statusBar().showMessage(u'Найдено записей: 0 (некорректный запрос)')
    for row in range(0,len(results)):
      results[row] = fixnumber(results[row][0]), results[row][1].title(), results[row][2].title(), results[row][3], results[row][4]
    tablemodel = MyTableModel(results, self.headers, self)
    self.resultTable.setModel(tablemodel)
    con.close()
    self.search.setEnabled(True)    
    
class MyTableModel(QtCore.QAbstractTableModel): 
  def __init__(self, datain, headerdata, parent=None, *args): 
    QtCore.QAbstractTableModel.__init__(self, parent, *args) 
    self.arraydata = datain
    self.headerdata = headerdata
 
  def rowCount(self, parent): 
    return len(self.arraydata) 
 
  def columnCount(self, parent): 
    return len(self.arraydata[0]) 
 
  def headerData(self, col, orientation, role):
    if orientation == QtCore.Qt.Horizontal and role == QtCore.Qt.DisplayRole:
       return QtCore.QVariant(self.headerdata[col])
    return QtCore.QVariant()
 
  def data(self, index, role): 
    if role != QtCore.Qt.DisplayRole: 
       return QtCore.QVariant() 
    return QtCore.QVariant(self.arraydata[index.row()][index.column()]) 
        
def fixstring(stringtofix):
  allowed = u' 0123456789abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя'
  newstring = ''
  for l in stringtofix:
    if l == '*':
      newstring = newstring + '%'
    elif l in allowed:
  	  newstring = newstring + l
  return newstring  

def stringnotempty(stringtocheck):
  allowed = u'0123456789abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя'
  for l in stringtocheck:
    if l in allowed:
      return True
  return False   

def fixnumber(numbertofix):
  if len(numbertofix) == 10: 
   	if numbertofix[0] == '4':
   	  numbertofix = '(' + numbertofix[:4] + ') ' + numbertofix[4:6] + '-' + numbertofix[6:8] + '-' + numbertofix[8:]
   	elif numbertofix[0] == '9':
   	  numbertofix = '8 ' + numbertofix[:3] + ' ' + numbertofix[3:6] + '-' + numbertofix[6:8] + '-' + numbertofix[8:]
  return numbertofix

app = QtGui.QApplication(sys.argv)
qb = MainWindow()
qb.show()
sys.exit(app.exec_())
Mandriva 2009.1 (desktop) / CentOS 5.1 (server)
Core 2 Duo E8400 / 4 Gb RAM / ASUS P5K / ASUS ENGTS250
Core 2 Duo E8200 / 2 Gb RAM / ECS G31T-M7 / ASUS EAH4850
Core 2 Duo E6550 / 2 Gb RAM / ASUS P5K SE / ASUS EAH2600XT

Аватара пользователя
АПП
Full Member
Full Member
Сообщения: 212
Зарегистрирован: 02 май 2008 15:39
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение АПП »

Вот ещё консольный вариант проги. Написал не я :)

Код: Выделить всё

#!/usr/bin/env python
# coding=utf8
#13.11.2008

import getopt, sys
from pysqlite2 import dbapi2 as sqlite

def usage():
    print 'telbase.py [-n=number] [-o=owner] [-s=street] [-h=house] [f=flat]'

def stringnotempty(stringtocheck):
    allowed = u'0123456789abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя'
    for l in stringtocheck:
        if l in allowed:
            return True
    return False   

def fixnumber(numbertofix):
    if len(numbertofix) == 10: 
        if numbertofix[0] == '4':
            numbertofix = '(' + numbertofix[:4] + ') ' + numbertofix[4:6] + '-' + numbertofix[6:8] + '-' + numbertofix[8:]
        elif numbertofix[0] == '9':
            numbertofix = '8 ' + numbertofix[:3] + ' ' + numbertofix[3:6] + '-' + numbertofix[6:8] + '-' + numbertofix[8:]
    return numbertofix

def fixstring(stringtofix):
    allowed = u' 0123456789abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя'
    newstring = ''
    for l in unicode(stringtofix, 'utf-8'):
        if l == '*':
            newstring = newstring + '%'
        elif l in allowed:
            newstring = newstring + l
    return newstring  

try:
    opts, args = getopt.getopt(sys.argv[1:], "n:o:s:h:f:")
except getopt.GetoptError:
    usage()
    sys.exit(2)
if 0 == len(opts):
    usage()
    sys.exit()
querystring = ""
clodic = {'-n':'number', '-o':'owner', '-s':'street', '-h':'house', '-f':'flat'}
fmt = '%-15s %-48s %-40s %-8s %-5s'
for o, a in opts:
    if o in ("-n", "-o", "-s" , "-h", "-f"):
        # print "debug: a before == '%s', after == '%s'" % (unicode(a,'utf-8'),fixstring(a))
        a = fixstring(a)
        if stringnotempty(a):
            querystring = " AND " + clodic[o] + " like '" + a + "'"
# print 'debug: querystring == %(querystring)s' % vars()
if querystring:
    con = sqlite.connect("phones2007.db")
    cur = con.cursor()
    select = "select * from phones where 1" + querystring + " order by number"
    cur.execute(select)
    results = cur.fetchall()
    print u'Найдено записей: %s' % len(results)
    if results:
        print fmt % (u'Номер', u'Владелец', u'Улица', u'Дом', u'Квартира')
        for row in range(0,len(results)):
            print fmt % (fixnumber(results[row][0]), results[row][1].title(), results[row][2].title(), results[row][3], results[row][4])
    con.close()
else:
    print u'Найдено записей: 0 (некорректный запрос)'
Mandriva 2009.1 (desktop) / CentOS 5.1 (server)
Core 2 Duo E8400 / 4 Gb RAM / ASUS P5K / ASUS ENGTS250
Core 2 Duo E8200 / 2 Gb RAM / ECS G31T-M7 / ASUS EAH4850
Core 2 Duo E6550 / 2 Gb RAM / ASUS P5K SE / ASUS EAH2600XT

jip
Newbie
Newbie
Сообщения: 1
Зарегистрирован: 07 ноя 2008 16:31

телефонный справочник 2008 года

Сообщение jip »

Говорят, в справочнике 2008 года другая схема БД.

Вот как бы я перегонял эту новую БД из MS Access в SQLite:

1. Ставим Kexi (также входит в состав koffice-database, к нему также понадобится модуль импорта mdb-файлов koffice-database-mdb)

2. Используя Kexi, импортируем tel_base.mdb в tel_base.kexi (если кто научит, как это сделать из командной строки, буду признателен)

3. Запускаем скрипт:

Код: Выделить всё

#!/bin/bash

ksqlite tel_base.kexi .dump |
egrep -v ' "?kexi__' |
sed 's/^CREATE TABLE kray (numer CLOB, vlad CLOB, street CLOB, numhome CLOB, numdoor CLOB);/CREATE TABLE phones (number CLOB, owner CLOB, street CLOB, house CLOB, flat CLOB);/;
     s/^INSERT INTO "kray" VALUES/INSERT INTO "phones" VALUES/' |
sqlite3 phones2008.db
4. В скриптах telbase-qt.py и telbase-cli.py можно исправить "phones2007.db" на "phones2008.db", а ещё лучше - на "phones.db" и сделать "ln -s phones2008.db phones.db", чтобы оставить возможность доступа к старым базам.
WBR,
jip

Аватара пользователя
antichrist
Full Member
Full Member
Сообщения: 248
Зарегистрирован: 19 апр 2008 17:05
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение antichrist »

Блин, а в ГТК никто не силен что ли?
Кто для ГТК нпаишет выложу базу 2008 в ЛИЧКУ ;D

Лимон
Full Member
Full Member
Сообщения: 140
Зарегистрирован: 26 июн 2009 15:11
Откуда: Владивосток

Re: Wine и телефонный справочник

Сообщение Лимон »

конвертация формата БД ms access -> sqlite3 в командной строке

Код: Выделить всё

aptitude install sqlite3 mdbtools
mdb-export -Q -d '`' tel_base.mdb kray | tail -n +2 > tel_base.txt
echo -e ".separator \` \n CREATE TABLE phones (number CLOB, owner CLOB, street CLOB, 
house CLOB, flat CLOB); \n.import tel_base.txt phones" | sqlite3 tel_base.db

Аватара пользователя
antichrist
Full Member
Full Member
Сообщения: 248
Зарегистрирован: 19 апр 2008 17:05
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение antichrist »

Лимон писал(а):конвертация формата БД ms access -> sqlite3 в командной строке

Код: Выделить всё

aptitude install sqlite3 mdbtools
mdb-export -Q -d '`' tel_base.mdb kray | tail -n +2 > tel_base.txt
echo -e ".separator \` \n CREATE TABLE phones (number CLOB, owner CLOB, street CLOB, 
house CLOB, flat CLOB); \n.import tel_base.txt phones" | sqlite3 tel_base.db
А старый файл оставлять? Там новые файлы какие - то появляются :o

Аватара пользователя
antichrist
Full Member
Full Member
Сообщения: 248
Зарегистрирован: 19 апр 2008 17:05
Откуда: Владивосток
Контактная информация:

Re: Wine и телефонный справочник

Сообщение antichrist »

Чет свежую базу не получается конвертировать :(.

Лимон
Full Member
Full Member
Сообщения: 140
Зарегистрирован: 26 июн 2009 15:11
Откуда: Владивосток

Re: Wine и телефонный справочник

Сообщение Лимон »

antichrist писал(а): А старый файл оставлять?
Там новые файлы какие - то появляются.
Чет свежую базу не получается конвертировать.
со старым файлом можешь делать, что хочешь.
должен появиться один новый файл tel_base.db
что не получается? чтобы тебе помогли, надо сообщить: 1. что ты сделал, 2. какой результат ты получил, 3. какой результат ты хотел получить.

Ответить