[QGIS Commit] r12892 - trunk/qgis/python/plugins/fTools/tools
svn_qgis at osgeo.org
svn_qgis at osgeo.org
Sun Feb 7 07:27:38 EST 2010
Author: cfarmer
Date: 2010-02-07 07:27:37 -0500 (Sun, 07 Feb 2010)
New Revision: 12892
Modified:
trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py
Log:
check for both lower- and upper-case extensions (fixes #2414), and clear field names upon update (fixes#2386).
Modified: trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py
===================================================================
--- trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py 2010-02-06 20:47:42 UTC (rev 12891)
+++ trunk/qgis/python/plugins/fTools/tools/doJoinAttributes.py 2010-02-07 12:27:37 UTC (rev 12892)
@@ -1,3 +1,4 @@
+# -*- coding: utf-8 -*-
#-----------------------------------------------------------
#
# Join Attributes
@@ -40,314 +41,317 @@
class Dialog(QDialog, Ui_Dialog):
- def __init__(self, iface):
- QDialog.__init__(self)
- self.iface = iface
- # Set up the user interface from Designer.
- self.setupUi(self)
- QObject.connect(self.toolOut, SIGNAL("clicked()"), self.outFile)
- QObject.connect(self.inShape, SIGNAL("currentIndexChanged(QString)"), self.iupdate)
- QObject.connect(self.joinShape, SIGNAL("currentIndexChanged(QString)"), self.jupdate)
- QObject.connect(self.toolTable, SIGNAL("clicked()"), self.inFile)
- QObject.connect(self.rdoTable, SIGNAL("clicked()"), self.updateTableFields)
- QObject.connect(self.rdoVector, SIGNAL("clicked()"), self.jupdate)
- self.setWindowTitle( self.tr("Join attributes") )
- # populate layer list
- self.progressBar.setValue(0)
- mapCanvas = self.iface.mapCanvas()
- for i in range(mapCanvas.layerCount()):
- layer = mapCanvas.layer(i)
- if layer.type() == layer.VectorLayer:
- self.inShape.addItem(layer.name())
- self.joinShape.addItem(layer.name())
+ def __init__(self, iface):
+ QDialog.__init__(self)
+ self.iface = iface
+ # Set up the user interface from Designer.
+ self.setupUi(self)
+ QObject.connect(self.toolOut, SIGNAL("clicked()"), self.outFile)
+ QObject.connect(self.inShape, SIGNAL("currentIndexChanged(QString)"), self.iupdate)
+ QObject.connect(self.joinShape, SIGNAL("currentIndexChanged(QString)"), self.jupdate)
+ QObject.connect(self.toolTable, SIGNAL("clicked()"), self.inFile)
+ QObject.connect(self.rdoTable, SIGNAL("clicked()"), self.updateTableFields)
+ QObject.connect(self.rdoVector, SIGNAL("clicked()"), self.jupdate)
+ self.setWindowTitle( self.tr("Join attributes") )
+ # populate layer list
+ self.progressBar.setValue(0)
+ mapCanvas = self.iface.mapCanvas()
+ for i in range(mapCanvas.layerCount()):
+ layer = mapCanvas.layer(i)
+ if layer.type() == layer.VectorLayer:
+ self.inShape.addItem(layer.name())
+ self.joinShape.addItem(layer.name())
- def iupdate(self, inputLayer):
- changedLayer = self.getVectorLayerByName(unicode(inputLayer))
- changedField = self.getFieldList(changedLayer)
- for i in changedField:
- self.inField.addItem(unicode(changedField[i].name()))
+ def iupdate(self, inputLayer):
+ changedLayer = self.getVectorLayerByName(unicode(inputLayer))
+ changedField = self.getFieldList(changedLayer)
+ self.inField.clear()
+ for i in changedField:
+ self.inField.addItem(unicode(changedField[i].name()))
- def jupdate(self):
- inputLayer = self.joinShape.currentText()
- if inputLayer != "":
- changedLayer = self.getVectorLayerByName(unicode(inputLayer))
- changedField = self.getFieldList(changedLayer)
- for i in changedField:
- self.joinField.addItem(unicode(changedField[i].name()))
-
- def accept(self):
- if self.inShape.currentText() == "":
- QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify target vector layer"))
- elif self.outShape.text() == "":
- QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify output shapefile"))
- elif self.joinShape.currentText() == "" and self.rdoVector.isChecked():
- QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify join vector layer"))
- elif self.inField.currentText() == "":
- QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify target join field"))
- elif self.joinField.currentText() == "":
- QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify join field"))
- elif self.inTable.text() == "" and self.rdoTable.isChecked():
- QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify input table"))
- else:
- keep = self.rdoKeep.isChecked()
- inName = self.inShape.currentText()
- inField = self.inField.currentText()
- if self.rdoVector.isChecked():
- joinName = self.joinShape.currentText()
- useTable = False
- else:
- joinName = self.inTable.text()
- useTable = True
- joinField = self.joinField.currentText()
- outPath = self.outShape.text()
- if outPath.contains("\\"):
- outName = outPath.right((outPath.length() - outPath.lastIndexOf("\\")) - 1)
- else:
- outName = outPath.right((outPath.length() - outPath.lastIndexOf("/")) - 1)
- if outName.endsWith(".shp"):
- outName = outName.left(outName.length() - 4)
- self.compute(inName, inField, joinName, joinField, outPath, keep, useTable, self.progressBar)
- self.outShape.clear()
- addToTOC = QMessageBox.question(self, self.tr("Join Attributes"), self.tr("Created output shapefile:\n%1\n\nWould you like to add the new layer to the TOC?").arg( unicode(self.shapefileName) ), QMessageBox.Yes, QMessageBox.No, QMessageBox.NoButton)
- if addToTOC == QMessageBox.Yes:
- vlayer = QgsVectorLayer(self.shapefileName, outName, "ogr")
- QgsMapLayerRegistry.instance().addMapLayer(vlayer)
- self.progressBar.setValue(0)
+ def jupdate(self):
+ inputLayer = self.joinShape.currentText()
+ if inputLayer != "":
+ changedLayer = self.getVectorLayerByName(unicode(inputLayer))
+ changedField = self.getFieldList(changedLayer)
+ self.jonField.clear()
+ for i in changedField:
+ self.joinField.addItem(unicode(changedField[i].name()))
+
+ def accept(self):
+ if self.inShape.currentText() == "":
+ QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify target vector layer"))
+ elif self.outShape.text() == "":
+ QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify output shapefile"))
+ elif self.joinShape.currentText() == "" and self.rdoVector.isChecked():
+ QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify join vector layer"))
+ elif self.inField.currentText() == "":
+ QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify target join field"))
+ elif self.joinField.currentText() == "":
+ QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify join field"))
+ elif self.inTable.text() == "" and self.rdoTable.isChecked():
+ QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Please specify input table"))
+ else:
+ keep = self.rdoKeep.isChecked()
+ inName = self.inShape.currentText()
+ inField = self.inField.currentText()
+ if self.rdoVector.isChecked():
+ joinName = self.joinShape.currentText()
+ useTable = False
+ else:
+ joinName = self.inTable.text()
+ useTable = True
+ joinField = self.joinField.currentText()
+ outPath = self.outShape.text()
+ if outPath.contains("\\"):
+ outName = outPath.right((outPath.length() - outPath.lastIndexOf("\\")) - 1)
+ else:
+ outName = outPath.right((outPath.length() - outPath.lastIndexOf("/")) - 1)
+ if outName.endsWith(".shp"):
+ outName = outName.left(outName.length() - 4)
+ self.compute(inName, inField, joinName, joinField, outPath, keep, useTable, self.progressBar)
+ self.outShape.clear()
+ addToTOC = QMessageBox.question(self, self.tr("Join Attributes"), self.tr("Created output shapefile:\n%1\n\nWould you like to add the new layer to the TOC?").arg( unicode(self.shapefileName) ), QMessageBox.Yes, QMessageBox.No, QMessageBox.NoButton)
+ if addToTOC == QMessageBox.Yes:
+ vlayer = QgsVectorLayer(self.shapefileName, outName, "ogr")
+ QgsMapLayerRegistry.instance().addMapLayer(vlayer)
+ self.progressBar.setValue(0)
- def outFile(self):
- self.outShape.clear()
- ( self.shapefileName, self.encoding ) = ftools_utils.saveDialog( self )
- if self.shapefileName is None or self.encoding is None:
- return
- self.outShape.setText( QString( self.shapefileName ) )
+ def outFile(self):
+ self.outShape.clear()
+ ( self.shapefileName, self.encoding ) = ftools_utils.saveDialog( self )
+ if self.shapefileName is None or self.encoding is None:
+ return
+ self.outShape.setText( QString( self.shapefileName ) )
- def inFile(self):
- self.outShape.clear()
- fileDialog = QFileDialog()
- fileDialog.setConfirmOverwrite(False)
- outName = fileDialog.getOpenFileName(self, self.tr("Join Table"), ".", "DBase Files (*.dbf)")
- fileCheck = QFile(outName)
- if fileCheck.exists():
- filePath = QFileInfo(outName).absoluteFilePath()
- if filePath.right(4) != ".dbf": filePath = filePath + ".dbf"
- if not outName.isEmpty():
- self.inTable.clear()
- self.inTable.insert(filePath)
- self.updateTableFields()
- else:
- QMessageBox.warning(self, self.tr("Join Attributes"), self.tr("Input table does not exist"))
+ def inFile(self):
+ self.outShape.clear()
+ fileDialog = QFileDialog()
+ fileDialog.setConfirmOverwrite(False)
+ outName = fileDialog.getOpenFileName(self, self.tr("Join Table"), ".", "DBase Files (*.dbf)")
+ fileCheck = QFile(outName)
+ if fileCheck.exists():
+ filePath = QFileInfo(outName).absoluteFilePath()
+ if filePath.right(4).toLower() != ".dbf": filePath = filePath + ".dbf"
+ if not outName.isEmpty():
+ self.inTable.clear()
+ self.inTable.insert(filePath)
+ self.updateTableFields()
+ else:
+ QMessageBox.warning(self, self.tr("Join Attributes"), self.tr("Input table does not exist"))
- def updateTableFields(self):
- if self.inTable.text() != "":
- filePath = self.inTable.text()
- f = open(unicode(filePath), 'rb')
- table = list(self.dbfreader(f))
- f.close()
- for i in table[0]:
- self.joinField.addItem(unicode(i))
- table = None
+ def updateTableFields(self):
+ if self.inTable.text() != "":
+ filePath = self.inTable.text()
+ f = open(unicode(filePath), 'rb')
+ table = list(self.dbfreader(f))
+ f.close()
+ self.joinField.clear()
+ for i in table[0]:
+ self.joinField.addItem(unicode(i))
+ table = None
- def compute(self, inName, inField, joinName, joinField, outName, keep, useTable, progressBar):
- layer1 = self.getVectorLayerByName(inName)
- provider1 = layer1.dataProvider()
- allAttrs = provider1.attributeIndexes()
- provider1.select(allAttrs)
- fieldList1 = self.getFieldList(layer1).values()
- index1 = provider1.fieldNameIndex(inField)
- if useTable:
- f = open(unicode(joinName), 'rb')
- table = list(self.dbfreader(f))
- f.close()
- (fieldList2, index2) = self.createFieldList(table, joinField)
- table = table[2:]
- func = lambda x: (unicode(type(x)) != "<type 'str'>" and QVariant(float(x))) or (QVariant(x))
- table = map(lambda f: map(func, f), table)
+ def compute(self, inName, inField, joinName, joinField, outName, keep, useTable, progressBar):
+ layer1 = self.getVectorLayerByName(inName)
+ provider1 = layer1.dataProvider()
+ allAttrs = provider1.attributeIndexes()
+ provider1.select(allAttrs)
+ fieldList1 = self.getFieldList(layer1).values()
+ index1 = provider1.fieldNameIndex(inField)
+ if useTable:
+ f = open(unicode(joinName), 'rb')
+ table = list(self.dbfreader(f))
+ f.close()
+ (fieldList2, index2) = self.createFieldList(table, joinField)
+ table = table[2:]
+ func = lambda x: (unicode(type(x)) != "<type 'str'>" and QVariant(float(x))) or (QVariant(x))
+ table = map(lambda f: map(func, f), table)
- else:
- layer2 = self.getVectorLayerByName(joinName)
- provider2 = layer2.dataProvider()
- allAttrs = provider2.attributeIndexes()
- provider2.select(allAttrs)
- fieldList2 = self.getFieldList(layer2)
- index2 = provider2.fieldNameIndex(joinField)
- fieldList2 = self.testForUniqueness(fieldList1, fieldList2.values())
- seq = range(0, len(fieldList1) + len(fieldList2))
- fieldList1.extend(fieldList2)
- fieldList1 = dict(zip(seq, fieldList1))
- sRs = provider1.crs()
- progressBar.setValue(13)
- check = QFile(self.shapefileName)
- if check.exists():
- if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName):
- return
- writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList1, provider1.geometryType(), sRs)
+ else:
+ layer2 = self.getVectorLayerByName(joinName)
+ provider2 = layer2.dataProvider()
+ allAttrs = provider2.attributeIndexes()
+ provider2.select(allAttrs)
+ fieldList2 = self.getFieldList(layer2)
+ index2 = provider2.fieldNameIndex(joinField)
+ fieldList2 = self.testForUniqueness(fieldList1, fieldList2.values())
+ seq = range(0, len(fieldList1) + len(fieldList2))
+ fieldList1.extend(fieldList2)
+ fieldList1 = dict(zip(seq, fieldList1))
+ sRs = provider1.crs()
+ progressBar.setValue(13)
+ check = QFile(self.shapefileName)
+ if check.exists():
+ if not QgsVectorFileWriter.deleteShapeFile(self.shapefileName):
+ return
+ writer = QgsVectorFileWriter(self.shapefileName, self.encoding, fieldList1, provider1.geometryType(), sRs)
- inFeat = QgsFeature()
- outFeat = QgsFeature()
- joinFeat = QgsFeature()
- inGeom = QgsGeometry()
- nElement = 0
- nFeats = provider1.featureCount()
- progressBar.setRange(nElement, nFeats)
- count = 0
- provider1.rewind()
- while provider1.nextFeature(inFeat):
- inGeom = inFeat.geometry()
- atMap1 = inFeat.attributeMap()
- outFeat.setAttributeMap(atMap1)
- outFeat.setGeometry(inGeom)
- none = True
- if useTable:
- for i in table:
- #sequence = range(0, len(table[0]))
- #atMap2 = dict(zip(sequence, i))
- if atMap1[index1].toString().trimmed() == i[index2].toString().trimmed():
- count = count + 1
- none = False
- atMap = atMap1.values()
- atMap2 = i
- atMap.extend(atMap2)
- atMap = dict(zip(seq, atMap))
- break
- else:
- provider2.rewind()
- while provider2.nextFeature(joinFeat):
- atMap2 = joinFeat.attributeMap()
- if atMap1[index1] == atMap2[index2]:
- none = False
- atMap = atMap1.values()
- atMap2 = atMap2.values()
- atMap.extend(atMap2)
- atMap = dict(zip(seq, atMap))
- break
- if none:
- outFeat.setAttributeMap(atMap1)
- else:
- outFeat.setAttributeMap(atMap)
- if keep: # keep all records
- writer.addFeature(outFeat)
- else: # keep only matching records
- if not none:
- writer.addFeature(outFeat)
- nElement += 1
- progressBar.setValue(nElement)
- del writer
+ inFeat = QgsFeature()
+ outFeat = QgsFeature()
+ joinFeat = QgsFeature()
+ inGeom = QgsGeometry()
+ nElement = 0
+ nFeats = provider1.featureCount()
+ progressBar.setRange(nElement, nFeats)
+ count = 0
+ provider1.rewind()
+ while provider1.nextFeature(inFeat):
+ inGeom = inFeat.geometry()
+ atMap1 = inFeat.attributeMap()
+ outFeat.setAttributeMap(atMap1)
+ outFeat.setGeometry(inGeom)
+ none = True
+ if useTable:
+ for i in table:
+ #sequence = range(0, len(table[0]))
+ #atMap2 = dict(zip(sequence, i))
+ if atMap1[index1].toString().trimmed() == i[index2].toString().trimmed():
+ count = count + 1
+ none = False
+ atMap = atMap1.values()
+ atMap2 = i
+ atMap.extend(atMap2)
+ atMap = dict(zip(seq, atMap))
+ break
+ else:
+ provider2.rewind()
+ while provider2.nextFeature(joinFeat):
+ atMap2 = joinFeat.attributeMap()
+ if atMap1[index1] == atMap2[index2]:
+ none = False
+ atMap = atMap1.values()
+ atMap2 = atMap2.values()
+ atMap.extend(atMap2)
+ atMap = dict(zip(seq, atMap))
+ break
+ if none:
+ outFeat.setAttributeMap(atMap1)
+ else:
+ outFeat.setAttributeMap(atMap)
+ if keep: # keep all records
+ writer.addFeature(outFeat)
+ else: # keep only matching records
+ if not none:
+ writer.addFeature(outFeat)
+ nElement += 1
+ progressBar.setValue(nElement)
+ del writer
- def createFieldList(self, table, joinField):
- fieldList = {}
- item = 0
- for i in table[0]:
- if unicode(i) == unicode(joinField):
- index2 = item
- info = table[1][item]
- name = i
- if info[0] == "C" or info[0] == "M" or info[0] == "D":
- qtype = QVariant.String
- ntype = "string"
- else:
- ntype = "double"
- qtype = QVariant.Double
- length = info[1]
- prec = info[2]
- field = QgsField(name, qtype, ntype, length, prec, self.tr("joined fields"))
- fieldList[item] = field
- item = item + 1
- return (fieldList, index2)
+ def createFieldList(self, table, joinField):
+ fieldList = {}
+ item = 0
+ for i in table[0]:
+ if unicode(i) == unicode(joinField):
+ index2 = item
+ info = table[1][item]
+ name = i
+ if info[0] == "C" or info[0] == "M" or info[0] == "D":
+ qtype = QVariant.String
+ ntype = "string"
+ else:
+ ntype = "double"
+ qtype = QVariant.Double
+ length = info[1]
+ prec = info[2]
+ field = QgsField(name, qtype, ntype, length, prec, self.tr("joined fields"))
+ fieldList[item] = field
+ item = item + 1
+ return (fieldList, index2)
- def testForUniqueness(self, fieldList1, fieldList2):
- changed = True
- while changed:
- changed = False
- for i in fieldList1:
- for j in fieldList2:
- if j.name() == i.name():
- j = self.createUniqueFieldName(j)
- changed = True
- return fieldList2
-
- def createUniqueFieldName(self, field):
- check = field.name().right(2)
- if check.startsWith("_"):
- (val,test) = check.right(1).toInt()
- if test:
- if val < 2:
- val = 2
- else:
- val = val + 1
- field.setName(field.name().left(len(field.name())-1) + unicode(val))
- else:
- field.setName(field.name() + "_2")
- else:
- field.setName(field.name() + "_2")
- return field
-
- def getVectorLayerByName(self, myName):
- mc = self.iface.mapCanvas()
- nLayers = mc.layerCount()
- for l in range(nLayers):
- layer = mc.layer(l)
- if layer.name() == unicode(myName):
- vlayer = QgsVectorLayer(unicode(layer.source()), unicode(myName), unicode(layer.dataProvider().name()))
- if vlayer.isValid():
- return vlayer
- else:
- QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Vector layer is not valid"))
+ def testForUniqueness(self, fieldList1, fieldList2):
+ changed = True
+ while changed:
+ changed = False
+ for i in fieldList1:
+ for j in fieldList2:
+ if j.name() == i.name():
+ j = self.createUniqueFieldName(j)
+ changed = True
+ return fieldList2
+
+ def createUniqueFieldName(self, field):
+ check = field.name().right(2)
+ if check.startsWith("_"):
+ (val,test) = check.right(1).toInt()
+ if test:
+ if val < 2:
+ val = 2
+ else:
+ val = val + 1
+ field.setName(field.name().left(len(field.name())-1) + unicode(val))
+ else:
+ field.setName(field.name() + "_2")
+ else:
+ field.setName(field.name() + "_2")
+ return field
+
+ def getVectorLayerByName(self, myName):
+ mc = self.iface.mapCanvas()
+ nLayers = mc.layerCount()
+ for l in range(nLayers):
+ layer = mc.layer(l)
+ if layer.name() == unicode(myName):
+ vlayer = QgsVectorLayer(unicode(layer.source()), unicode(myName), unicode(layer.dataProvider().name()))
+ if vlayer.isValid():
+ return vlayer
+ else:
+ QMessageBox.information(self, self.tr("Join Attributes"), self.tr("Vector layer is not valid"))
- def getFieldList(self, vlayer):
- fProvider = vlayer.dataProvider()
- feat = QgsFeature()
- allAttrs = fProvider.attributeIndexes()
- fProvider.select(allAttrs)
- myFields = fProvider.fields()
- return myFields
- def dbfreader(self, f):
- """Returns an iterator over records in a Xbase DBF file.
+ def getFieldList(self, vlayer):
+ fProvider = vlayer.dataProvider()
+ feat = QgsFeature()
+ allAttrs = fProvider.attributeIndexes()
+ fProvider.select(allAttrs)
+ myFields = fProvider.fields()
+ return myFields
+ def dbfreader(self, f):
+ """Returns an iterator over records in a Xbase DBF file.
- The first row returned contains the field names.
- The second row contains field specs: (type, size, decimal places).
- Subsequent rows contain the data records.
- If a record is marked as deleted, it is skipped.
+ The first row returned contains the field names.
+ The second row contains field specs: (type, size, decimal places).
+ Subsequent rows contain the data records.
+ If a record is marked as deleted, it is skipped.
- File should be opened for binary reads.
+ File should be opened for binary reads.
- """
- numrec, lenheader = struct.unpack('<xxxxLH22x', f.read(32))
- numfields = (lenheader - 33) // 32
+ """
+ numrec, lenheader = struct.unpack('<xxxxLH22x', f.read(32))
+ numfields = (lenheader - 33) // 32
- fields = []
- for fieldno in xrange(numfields):
- name, typ, size, deci = struct.unpack('<11sc4xBB14x', f.read(32))
- name = name.replace('\0', '') # eliminate NULs from string
- fields.append((name, typ, size, deci))
- yield [field[0] for field in fields]
- yield [tuple(field[1:]) for field in fields]
+ fields = []
+ for fieldno in xrange(numfields):
+ name, typ, size, deci = struct.unpack('<11sc4xBB14x', f.read(32))
+ name = name.replace('\0', '') # eliminate NULs from string
+ fields.append((name, typ, size, deci))
+ yield [field[0] for field in fields]
+ yield [tuple(field[1:]) for field in fields]
- terminator = f.read(1)
- assert terminator == '\r'
+ terminator = f.read(1)
+ assert terminator == '\r'
- fields.insert(0, ('DeletionFlag', 'C', 1, 0))
- fmt = ''.join(['%ds' % fieldinfo[2] for fieldinfo in fields])
- fmtsiz = struct.calcsize(fmt)
- for i in xrange(numrec):
- record = struct.unpack(fmt, f.read(fmtsiz))
- if record[0] != ' ':
- continue # deleted record
- result = []
- for (name, typ, size, deci), value in itertools.izip(fields, record):
- if name == 'DeletionFlag':
- continue
- if typ == "N":
- value = value.replace('\0', '').lstrip()
- if value == '':
- value = 0
- elif deci:
- value = decimal.Decimal(value)
- else:
- value = int(value)
- elif typ == 'D':
- y, m, d = int(value[:4]), int(value[4:6]), int(value[6:8])
- value = datetime.date(y, m, d)
- elif typ == 'L':
- value = (value in 'YyTt' and 'T') or (value in 'NnFf' and 'F') or '?'
- result.append(value)
- yield result
+ fields.insert(0, ('DeletionFlag', 'C', 1, 0))
+ fmt = ''.join(['%ds' % fieldinfo[2] for fieldinfo in fields])
+ fmtsiz = struct.calcsize(fmt)
+ for i in xrange(numrec):
+ record = struct.unpack(fmt, f.read(fmtsiz))
+ if record[0] != ' ':
+ continue # deleted record
+ result = []
+ for (name, typ, size, deci), value in itertools.izip(fields, record):
+ if name == 'DeletionFlag':
+ continue
+ if typ == "N":
+ value = value.replace('\0', '').lstrip()
+ if value == '':
+ value = 0
+ elif deci:
+ value = decimal.Decimal(value)
+ else:
+ value = int(value)
+ elif typ == 'D':
+ y, m, d = int(value[:4]), int(value[4:6]), int(value[6:8])
+ value = datetime.date(y, m, d)
+ elif typ == 'L':
+ value = (value in 'YyTt' and 'T') or (value in 'NnFf' and 'F') or '?'
+ result.append(value)
+ yield result
More information about the QGIS-commit
mailing list