Ну давай, как - нить перресечмся, я тебе базу, а ты расскажешь, как твоей утилиткой пользоваться!
Wine и телефонный справочник
- antichrist
- Full Member
- Сообщения: 248
- Зарегистрирован: 19 апр 2008 17:05
- Откуда: Владивосток
- Контактная информация:
- АПП
- 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
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
- Сообщения: 248
- Зарегистрирован: 19 апр 2008 17:05
- Откуда: Владивосток
- Контактная информация:
Re: Wine и телефонный справочник
Ну давай, как соберусь, тебе в личку сообщу! Кажись у меня остался твой алрес.АПП писал(а):Сможешь ко мне на работу (на Нерчинскую) на неделе подойти, передать диск с базой?antichrist писал(а):Ну давай, как - нить перресечмся, я тебе базу, а ты расскажешь, как твоей утилиткой пользоваться!
- АПП
- Full Member
- Сообщения: 212
- Зарегистрирован: 02 май 2008 15:39
- Откуда: Владивосток
- Контактная информация:
Re: Wine и телефонный справочник
Договорились. И по возможности захвати с собой флэшку, чтобы матрицу не тратить, - сразу конвертируем базу 2007 года в формат sqlite и немного приведём её в порядок.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
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
- Сообщения: 248
- Зарегистрирован: 19 апр 2008 17:05
- Откуда: Владивосток
- Контактная информация:
Re: Wine и телефонный справочник
OkАПП писал(а):Договорились. И по возможности захвати с собой флэшку, чтобы матрицу не тратить, - сразу конвертируем базу 2007 года в формат sqlite и немного приведём её в порядок.antichrist писал(а):Ну давай, как соберусь, тебе в личку сообщу! Кажись у меня остался твой алрес.
- АПП
- 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* - будут показаны все городские номера Владивостока.
Размер архива - 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
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
- Сообщения: 1205
- Зарегистрирован: 08 июн 2006 00:32
- Откуда: Владивосток
- Контактная информация:
Re: Wine и телефонный справочник
Давай саму прогу разместим здесь, можно и ссылку, а база уже как бы, варез, так что через личку автору... ну можно как бы торрент сделать
Прошли времена когда на элементарные вопросы можно было отвечать man <что-то там> (с) из сети
Hatred's Log Place | My GitHub repos | My Gitlab repos
Hatred's Log Place | My GitHub repos | My Gitlab repos
- АПП
- 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
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
- Сообщения: 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
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
телефонный справочник 2008 года
Говорят, в справочнике 2008 года другая схема БД.
Вот как бы я перегонял эту новую БД из MS Access в SQLite:
1. Ставим Kexi (также входит в состав koffice-database, к нему также понадобится модуль импорта mdb-файлов koffice-database-mdb)
2. Используя Kexi, импортируем tel_base.mdb в tel_base.kexi (если кто научит, как это сделать из командной строки, буду признателен)
3. Запускаем скрипт:
4. В скриптах telbase-qt.py и telbase-cli.py можно исправить "phones2007.db" на "phones2008.db", а ещё лучше - на "phones.db" и сделать "ln -s phones2008.db phones.db", чтобы оставить возможность доступа к старым базам.
Вот как бы я перегонял эту новую БД из 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
WBR,
jip
jip
- antichrist
- Full Member
- Сообщения: 248
- Зарегистрирован: 19 апр 2008 17:05
- Откуда: Владивосток
- Контактная информация:
Re: Wine и телефонный справочник
Блин, а в ГТК никто не силен что ли?
Кто для ГТК нпаишет выложу базу 2008 в ЛИЧКУ
Кто для ГТК нпаишет выложу базу 2008 в ЛИЧКУ
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
- Сообщения: 248
- Зарегистрирован: 19 апр 2008 17:05
- Откуда: Владивосток
- Контактная информация:
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
- Сообщения: 248
- Зарегистрирован: 19 апр 2008 17:05
- Откуда: Владивосток
- Контактная информация:
Re: Wine и телефонный справочник
Чет свежую базу не получается конвертировать .
Re: Wine и телефонный справочник
со старым файлом можешь делать, что хочешь.antichrist писал(а): А старый файл оставлять?
Там новые файлы какие - то появляются.
Чет свежую базу не получается конвертировать.
должен появиться один новый файл tel_base.db
что не получается? чтобы тебе помогли, надо сообщить: 1. что ты сделал, 2. какой результат ты получил, 3. какой результат ты хотел получить.