def pbtnImportujClicked(self): uni = lambda s: s if type(s) == unicode else unicode(s,'utf-8','replace') srid = str(self.dlg.ui.leditSRIDImport.text()) if self.f == 0 or self.f.closed: QMessageBox.warning(self.dlg, 'Uwaga!!!', u"Przed rozpoczęciem importu musisz wczytać plik oraz dokonać jego analizy") else: id_jed_rej = self.dlg.ui.leditIDZD.text() #TODO sprawdzenie czy nie jest puste oraz sprawdzenie czy w bazie juz takiego nie ma (mozna to sprawdzenie wykonac podczas analizy) - rstrip na wszelki wypadek id_jed_rej = str(id_jed_rej).rstrip() pyproj4strFrom = self.cmb_pyproj4_items[unicode(self.dlg.ui.cmbPyprojFrom.currentText(),'utf-8')] pyproj4strTo = self.cmb_pyproj4_items[unicode(self.dlg.ui.cmbPyprojTo.currentText(),'utf-8')] #lista column tablicowych - do innej obróbki niż pozostałe arrayCols = ['G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RSKD', 'G5RDOK', 'G5RDZE', 'G5ROBJ'] #słownik kolumn do zmiany nazwy - zmieniamy polskie znaki w nazwie kolumn bo trochę to broi przy pytaniach SQL plcharCols = {u'G5RŻONA':'G5RZONA', u'G5RMĄŻ':'G5RMAZ', u'G5RPWŁ':'G5RPWL', u'G5RWŁ':'G5RWL', u'G5RWŁS':'G5RWLS', u'G5RWŁD':'G5RWLD'} g5Cols = {} #słownik zbudowany: {'nazwa_tabeli':Tablica_Column[]} - posluzy do inicjacji tabel - obiektow robdbtable #inicjalizacja bazy danych rdbase = RobDBBase(str(self.pgserver), str(self.pgbase), str(self.pguser), str(self.pguserpswd), 1) rdg5Table = {} #słownik zawiera następującą strukturę: {'nazwa_tabeli': Obiekt_rdbtable} tableList = [] #tabela nazw tabel - wykorzystywane w roznych miejscach - miedzy innymi przy sprawdzeniu czy dana tabela została wybrana do importu #jest to lista tabel, ktore beda brane pod uwage - glowny cel - kontrola nad danymi w trakcie pisania tego skryptu #okreslenie rodzaju importu if self.dlg.ui.rdbtnZwyklyImport.isChecked() or self.dlg.ui.rdbtnAktualizacja.isChecked(): #sprawdzenie ktore z tabel mają być importowane - nie brane pod uwagę wprzypadku importu testowego if self.dlg.ui.chckG5dze.isChecked(): tableList.append('G5DZE') if self.dlg.ui.chckG5obr.isChecked(): tableList.append('G5OBR') if self.dlg.ui.chckG5jew.isChecked(): tableList.append('G5JEW') if self.dlg.ui.chckG5jdr.isChecked(): tableList.append('G5JDR') if self.dlg.ui.chckG5adr.isChecked(): tableList.append('G5ADR') if self.dlg.ui.chckG5dze.isChecked(): tableList.append('G5DZE') if self.dlg.ui.chckG5udz.isChecked(): tableList.append('G5UDZ') if self.dlg.ui.chckG5udw.isChecked(): tableList.append('G5UDW') if self.dlg.ui.chckG5osf.isChecked(): tableList.append('G5OSF') if self.dlg.ui.chckG5ins.isChecked(): tableList.append('G5INS') if self.dlg.ui.chckG5mlz.isChecked(): tableList.append('G5MLZ') if self.dlg.ui.chckG5osz.isChecked(): tableList.append('G5OSZ') if self.dlg.ui.chckG5klu.isChecked(): tableList.append('G5KLU') if self.dlg.ui.chckG5uzg.isChecked(): tableList.append('G5UZG') if self.dlg.ui.chckG5dok.isChecked(): tableList.append('G5DOK') if self.dlg.ui.chckG5bud.isChecked(): tableList.append('G5BUD') if self.dlg.ui.chckG5lkl.isChecked(): tableList.append('G5LKL') if self.dlg.ui.chckG5zmn.isChecked(): tableList.append('G5ZMN') if self.dlg.ui.chckG5kkl.isChecked(): tableList.append('G5KKL') if self.dlg.ui.chckG5zmn.isChecked(): tableList.append('G5ZMN') Cols = ['G5IDJ', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU','G5RKRG']#g5jew g5Cols['G5JEW'] = Cols Cols = [ 'G5IDD', 'GEOM', 'NR', 'G5IDR', 'G5NOS', 'G5WRT', 'G5DWR', 'G5PEW', 'G5RZN', 'G5DWW', 'G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RJDR', 'G5DTW', 'G5DTU'] #g5dze g5Cols['G5DZE'] = Cols Cols = [ 'G5NRO', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU', 'G5RKRG', 'G5RJEW', 'IDJEW'] #g5obr g5Cols['G5OBR'] = Cols Cols = ['G5PLC', 'G5PSL', 'G5NIP', 'G5NZW', 'G5PIM', 'G5DIM', 'G5OIM', 'G5MIM', 'G5OBL', 'G5DOS', 'G5RADR', 'G5STI', 'G5DTW', 'G5DTU'] #g5osf g5Cols['G5OSF'] = Cols Cols = [ 'G5STI', 'G5NPE', 'G5NSK', 'G5RGN', 'G5NIP', 'G5NZR', 'G5NRR', 'G5NSR', 'G5RADR', 'G5DTW', 'G5DTU'] #g5ins g5Cols['G5INS'] = Cols Cols = ['G5RZONA', 'G5RMAZ', 'G5DTW', 'G5DTU'] #g5mlz g5Cols['G5MLZ'] = Cols Cols = [ 'G5STI', 'G5NPE', 'G5NSK', 'G5RGN', 'G5NIP', 'G5RSKD', 'G5RADR', 'G5DTW', 'G5DTU'] #g5osz g5Cols['G5OSZ'] = Cols Cols = ['G5TJR', 'G5IJR', 'G5RGN', 'G5RWL', 'G5RWLS', 'G5RWLD', 'G5ROBR', 'G5DTW', 'G5DTU' ] #g5jdr g5Cols['G5JDR'] = Cols Cols = [ 'G5UD', 'G5RWLS', 'G5RPOD', 'G5DTW', 'G5DTU'] #g5udz g5Cols['G5UDZ'] = Cols Cols = [ 'G5RWD', 'G5UD', 'G5RWLD', 'G5RPOD', 'G5DTW', 'G5DTU'] #g5udw g5Cols['G5UDW'] = Cols Cols = [ 'G5OFU', 'G5OZU', 'G5OZK', 'G5PEW', 'G5RDZE', 'G5DTW', 'G5DTU'] #g5klu g5Cols['G5KLU'] = Cols Cols = [ 'G5IDT', 'G5OZU','G5OFU', 'G5PEW', 'G5RKRG', 'G5ROBR', 'G5DTW', 'G5DTU'] #g5uzg g5Cols['G5UZG'] = Cols Cols = ['G5KDK', 'G5DTD', 'G5DTP', 'G5SYG', 'G5NSR', 'G5OPD', 'G5RDOK', 'G5DTW', 'G5DTU'] #g5dok g5Cols['G5DOK'] = Cols Cols = ['G5TAR', 'G5NAZ', 'G5KRJ', 'G5WJD', 'G5PWJ', 'G5GMN', 'G5ULC', 'G5NRA', 'G5NRL', 'G5MSC', 'G5KOD', 'G5PCZ', 'G5DTW', 'G5DTU']#g5adr g5Cols['G5ADR'] = Cols Cols = ['G5IDB', 'G5FUZ', 'G5WRT', 'G5DWR', 'G5RBB', 'G5PEW', 'G5PEU', 'G5RZN', 'G5SCN', 'G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RJDR','G5RDZE', 'G5DTU', 'G5DTW']#g5bud g5Cols['G5BUD'] = Cols Cols = ['G5IDK', 'G5OZU', 'G5OZK', 'G5PEW', 'G5RKRG', 'G5ROBR', 'G5DTW', 'G5DTU'] g5Cols['G5KKL'] = Cols Cols = ['G5IDL', 'G5TLOK', 'G5PEW', 'G5PPP', 'G5LIZ', 'G5WRT', 'G5DWR', 'G5RJDR', 'G5RADR', 'G5RDOK', 'G5RBUD', 'G5DTW', 'G5DTU'] g5Cols['G5LKL'] = Cols Cols = ['G5NRZ', 'G5STZ', 'G5DZZ', 'G5DTA', 'G5DTZ', 'G5NAZ', 'G5ROBJ', 'G5RDOK', 'G5DTW', 'G5DTU'] g5Cols['G5ZMN'] = Cols elif self.dlg.ui.rdbtnImportTestowy.isChecked(): #w przypadku importu testowego importować będziemy tylko jedną z trzech tabel (dze, obr, lub jew) # przy okazji opróżnimy zawartość dotychczasowych tabel testowych delSQLstr = "delete from " if self.dlg.ui.rdbtnTestowyJEW.isChecked(): tableList.append('G5JEW') g5Cols['G5JEW'] = ['G5IDJ', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU','G5RKRG']#g5jew delSQLstr += "g5jew_test;" elif self.dlg.ui.rdbtnTestowyOBR.isChecked(): tableList.append('G5OBR') g5Cols['G5OBR'] = [ 'G5NRO', 'G5PEW', 'G5NAZ', 'G5DTW', 'G5DTU', 'G5RKRG', 'G5RJEW', 'IDJEW'] delSQLstr += "g5obr_test;" elif self.dlg.ui.rdbtnTestowyDZE.isChecked(): tableList.append('G5DZE') g5Cols['G5DZE'] = [ 'G5IDD', 'GEOM', 'NR', 'G5IDR', 'G5NOS', 'G5WRT', 'G5DWR', 'G5PEW', 'G5RZN', 'G5DWW', 'G5RADR', 'G5RPWL', 'G5RPWD', 'G5RKRG', 'G5RJDR', 'G5DTW', 'G5DTU'] delSQLstr += "g5dze_test;" rdbase.executeSQL(delSQLstr) #nazwy kolumn muszą zostać podane dokładnie jak w bazie - czyli małymi literami #na przyszłość można to rozwiązać w samej RobDBTable #za zamianę liter na małe w tablicy odpowiada ta fikuśna konstrukcja: [x.lower() ....] for tableName in tableList: if self.dlg.ui.rdbtnImportTestowy.isChecked(): appendix = '_TEST' else: appendix = '' rdg5Table[tableName] = RobDBTable(rdbase, tableName + appendix, [x.lower() for x in g5Cols[tableName]], 1, 1) G5Table = "" collist = [] valuelist = [] insertdic = {} # forma [nazwa_tabeli:ilosc_insertow] arraylist = [] #wykorzystywana do przechowywania kolumn typu tablicaowego w formie [[col2, wart..], [col1, wart..], [col2, wart..]] arrayvalue = [] # wykorzystywane do przechowywania danych 1+ takich jak g5rkrg arrayname = '' # nazwa tablicy tożsama z nazwą kolumny w bazie pointslist = [] point = [] Kznak = "" #znacznik + albo -, oznaczajacy czy okreslane sa punkty tworzace polygon czy #wycinajace w nim dziure oldKznak = "0" #posluzy do sprawdzenia czy nastapila zmiana Kznak newPoly = 0 polycount = 0 ilosc_linii = self.ilosc_linii linianr = 0 #przyda sie w momencie gdy sie program wywali - okresli ktora linia pliku swde nabroiła obieg = 0 #bedzie wykorzystywane przy commit do bazy, ktore bedzie realizowane co np 100 pytań SQL txtcodec = self.txtCodec() transform = 0 if self.dlg.ui.rdbtnImportTestowy.isChecked() == 0: #tylko jesli nie jest to import testowy transform = self.dlg.ui.chckTransform.isChecked() self.dlg.ui.peditOutput.appendPlainText("Krok 1. Start programu: " + time.strftime("%Y-%m-%d %H:%M:%S")) pgdlg = QProgressDialog(u"Postęp", "Przerwij...", 0, 0) if self.dlg.ui.rdbtnAktualizacja.isChecked(): #usuniecie wszystkich rekordow o id_zd pgdlg.setLabelText(u"Usuwanie rekordów ze zbioru danych o id = " + id_jed_rej) pgdlg.show() #naprawde dziwna sprawa, ale bez tego dwukrotnie powtorzonego slepp-applicationevent #dialog się nie odświerza time.sleep(0.1) QApplication.processEvents() time.sleep(0.1) QApplication.processEvents() self.dlg.ui.peditOutput.appendPlainText(u"Rozpoczęcie usuwania aktualizowanych rekordów: " + time.strftime("%Y-%m-%d %H:%M:%S")) rdbase.executeSQL("SELECT g5sp_delfromtables('" + id_jed_rej + "');") self.dlg.ui.peditOutput.appendPlainText(u"Zakończono usuwanie aktualizowanych rekordów: " + time.strftime("%Y-%m-%d %H:%M:%S")) #import_file = str(self.swde_file.toUtf8()).decode('utf-8') try: #self.f = open(self.swde_file "r") self.f.seek(0.0) try: self.dlg.ui.peditOutput.appendPlainText(u"Krok 2. Rozpoczynam import pliku: " + self.f.name + " " + time.strftime("%Y-%m-%d %H:%M:%S")) i = 0; pgval = 0; #value progress bara linianr = 0 step = ilosc_linii/100 pgdlg.setRange(0,100) pgdlg.setLabelText(u"Trwa aktualizacja bazy .... ") #pgdlg.setMinimumDuration(1000) pgdlg.show() QApplication.processEvents() przerwanie = 0 # wartość 1 będzie świadczyć o tym, że albo zostało przerwane przez użytkownika albo z powodu błędu #w takim przypadku nie zostanie wykonany commit do bazy for line in self.f.readlines(): if i == step: pgval = pgval + 1 pgdlg.setValue(pgval) #QApplication.processEvents() i = 0 if pgdlg.wasCanceled(): przerwanie = 1 break line = unicode(line, txtcodec) i= i + 1 linianr+=1 #przyda sie jak sie program wypierniczy pocz = StringBetweenChar(line, ',',0) if pocz == "RO" or pocz == "RD" or pocz == "RC": #line = unicode(line, txtcodec) G5Table = StringBetweenChar(line, ',',2) g5id1_value = StringBetweenChar(line,',',3) g5id2_value = StringBetweenChar(line,',',4) if line[0:3] == "P,P": #self.dlg.ui.peditOutput.appendPlainText(u"znaleziono ciąg line 0:3 = P,P") str1 = StringBetweenChar(line, ',', 2) #self.dlg.ui.peditOutput.appendPlainText(u"str1 = " + str1 + u" o długości " + str(len(str1)) ) if str1 == u"G5PZG": #self.dlg.ui.peditOutput.appendPlainText(u"wlazło") nr = StringBetweenChar(line, ',', 3) #self.dlg.ui.peditOutput.appendPlainText(u"nr = " + nr) #strnr = nr.rstrip(';\r')# trzeba usuwac pojedynczo czyli tak jak poniżej strnr = nr.rstrip()# czyli jakiekolwiek białe znaki niezaleznie czy \n \r itp strnr = strnr.rstrip(';') #self.dlg.ui.peditOutput.appendPlainText(u"strnr = " + strnr) #oldline = line #self.dlg.ui.peditOutput.appendPlainText(u"oldline = " + oldline) line = "P,G," + self.pzgdic[strnr] + ",;\n" #self.dlg.ui.peditOutput.appendPlainText(u"line = " + line) #self.dlg.ui.peditOutput.appendPlainText(u"Zastąpiono ciąg P,P >>" + oldline + "<< na >>" + line + "<< " + time.strftime("%Y-%m-%d %H:%M:%S")) if G5Table in tableList: #line = unicode(line, txtcodec) colname = "" colvalue = "" znacznik = StringBetweenChar(line, ',',0) if znacznik == "D" or znacznik == "WG": line = line.rstrip() line = line.rstrip(';') # szczególnie linie ze znacznikami WG zakończone są średnikiem line = line.strip("'") line = line.strip('"') line = line.replace("'", '') line = line.replace('"', "") colname = StringBetweenChar(line,',',1) #zamiana nazw kolumn z polskimi znakami if colname in plcharCols: colname = plcharCols[colname] colvalue = StringBetweenChar(line,',',3) #dzialania wspolne dla wszystkich tablic if colname in g5Cols[G5Table]: #G5RDZE w G5KLU nie jest typu tablicowego, natomiast w g5BUD #jest. Na szczescie w g5klu nie ma żadnego pola tablicowego if colname in arrayCols and G5Table != 'G5KLU': arraylist.append([colname,colvalue]) else: collist.append(colname) valuelist.append(colvalue) #dzialania nietypowe #TODO przewidziec dla g5obr wyluskanie numeru obrebu do osobnego pola if colname == 'G5IDD' and G5Table == "G5DZE": #trzeba wyluskac numer dzialki i zapisac do oddzielnej kolumny #nr_dzialki = StringBetweenChar(colvalue, '.', 2) collist.append(u'nr') valuelist.append(StringBetweenChar(colvalue, '.', 2)) #nr obrębu też się przyda collist.append(u'nrobr') valuelist.append(StringBetweenChar(colvalue, '.', 1)) if colname == 'G5RPOD': #dla tabel g5udz i g5udw - wyglada to nastepujaco: "WG,G5RPOD,G5OSF,5465;" #a więc najpierw mamy określenie do jakiej tabeli jest dowiązanie (osf, ins, mlz czy osz) #a potem wartość wiązania w danej tabeli. Należy więc jeszcze wyciągnąć wartość po drugim ',' collist.append(u'rpod_rodzaj') pod_rodzaj = StringBetweenChar(line, ',', 2) valuelist.append(pod_rodzaj) #kolumna zawierajaca polaczone ze soba wartosci collist.append(u'id_podmiot') valuelist.append(colvalue + pod_rodzaj) elif znacznik == "K": Kznak = StringBetweenChar(line, ',',1)#czyli albo '+;' albo '-;' Kznak = Kznak[0]#pozostawienie tylko + albo - newPoly = 1 polycount+=1 elif znacznik == "P": yvalue = StringBetweenChar(line, ',',2) xvalue = StringBetweenChar(line, ',',3) #print "xv:", xvalue, "yv:", yvalue if transform == 1 : p1 = pyproj.Proj(pyproj4strFrom) p2 = pyproj.Proj(pyproj4strTo) x92, y92 = pyproj.transform(p1,p2,xvalue,yvalue) value = str(x92) + " " + str(y92) else: value = xvalue + " " + yvalue point.append( polycount) point.append(newPoly) point.append(Kznak) point.append(value) pointslist.append(point) #print point point = [] newPoly = 0 elif znacznik[0] == "X": #czyli koniec definicji recordu #print "2 line", line #print "2 znacznik = ", znacznik, collist, valuelist p = "" p1 = "" if len(pointslist)>0: for points in pointslist: if points[1] == 1:#newPoly #p1 = points[3] if points[0] == 1:#czyli pierwszy i byc moze jedyny polygon if srid == -1: #niezdefiniowany układ p = "POLYGON((" else: p = "@ST_GeomFromText(\'POLYGON((" else: #czyli ewentualne kolejne polygony p = p + p1 + "),(" p1 = points[3] p = p + points[3] + ',' if srid == -1: p = p + p1 + "))" else: p = p + p1 + "))\'," + srid + ")" collist.append("geom") valuelist.append(p) #dodanie kolumn tablicowych if len(arraylist) > 0: old_col = '' arraystr = "ARRAY[" arraylist.sort() for col, val in arraylist: if old_col == '': #startujemy old_col = col if col == old_col: arraystr += "\'"+ val + "\'," else: #nastąpiła zmiana columny arraystr = arraystr.rstrip(",") arraystr += "]" collist.append(old_col) valuelist.append(arraystr) old_col = col arraystr = "ARRAY[\'" + val + "\'," collist.append(old_col) arraystr = arraystr.rstrip(",") arraystr += ']' valuelist.append(arraystr) arraylist = [] #dodatnie id_jed_rej do kazdej tabeli collist.append("id_zd") valuelist.append(id_jed_rej) #dodanie id1 i id2 do kazdej z tabel collist.append("g5id1") valuelist.append(g5id1_value) collist.append("g5id2") valuelist.append(g5id2_value) #dodanie unikatowej kolumny - będzie stanowiła klucz główny w całej bazie collist.append('tab_uid') valuelist.append(id_jed_rej+g5id1_value) #sprawdzenie czy jest jeszcze jakas tablica, ktora nie zostala dodana do valuelist if len(arrayvalue)>0: collist.append(arrayname) values = "" for value in arrayvalue: values += "\'" + value.strip('[]') + "\'," values = values.rstrip(",")#usuniecie ostatniego przecinka valuelist.append(u"ARRAY[" + values + "]") arrayname = '' arrayvalue = [] rdg5Table[G5Table].insert(0, collist, valuelist) if G5Table in insertdic: insertdic[G5Table] += 1 else: insertdic[G5Table] = 1 QApplication.processEvents() #obieg+=1 #if obieg == 1000: # rdbase.commit() # obieg = 0 obieg+=1 collist = [] valuelist = [] pointslist = [] Kznak = "" polycount = 0 G5Table = "" if self.dlg.ui.rdbtnImportTestowy.isChecked() and self.dlg.ui.rdbtnTestowyJEW.isChecked(): #w tym przypadku nie ma co dalej ciągnąć pętli break #i = i+1 except Exception, ex: cols = "[" values = "[" for col in collist: cols += col + ", " for value in valuelist: values += value + ", " cols += "]" values += "]" self.dlg.ui.peditOutput.appendPlainText(u"błąd: " + uni(G5Table) + " " + uni(cols) + " " + uni(values) + "rekord nr: " + uni(str(obieg)) + "line = " + uni(line)+ " error: " + uni(str(ex)) ) przerwanie = 1 finally: if przerwanie == 1: rdbase.rollback() self.dlg.ui.peditOutput.appendPlainText("anulowano zapis do bazy: " + str(obieg) + u" rekordów: " + str(insertdic)) else: rdbase.commit() insstr = "" for tab, ilosc in insertdic.items(): insstr += tab + ':' + str(ilosc) + '; ' self.dlg.ui.peditOutput.appendPlainText("zapisano do bazy: " + str(obieg) + u" rekordów: " + insstr) #self.dlg.ui.peditOutput.appendPlainText("przerobiono lini: " + str(linianr)) #self.dlg.ui.peditOutput.appendPlainText(u"Plik zamknięty: " + time.strftime("%Y-%m-%d %H:%M:%S")) self.f.close() except IOError: self.dlg.ui.peditOutput.appendPlainText("IOError: " + time.strftime("%Y-%m-%d %H:%M:%S"))