ต้องการพอร์ตข้อมูลที่เป็น dbf ของ Visual Foxpro มาลงใน postgres โดยใช้โมดูล adodb ค้นกูเกิลเจอโมดูลในการอ่าน Visual Foxpro dbf ที่ เว็บของคุณ Yusdi Santoso หมวด Software Repository
ใช้งานได้ดีทีเดียว เพราะอ่าน Memo Field ของ Visual Foxpro ออกหมด
แต่ดันพลาดตอนไม่ได้ตรวจสอบข้อมูลของ Memo Field เพราะเขาเอาไบต์ที่เป็น Null มาด้วย ('\x00')
อยากได้ดิกฯ แบบที่สามารถเติมข้อมูลได้ ทั้งแนวกว้างและแนวลึก และให้เป็นข้อมูลแบบ Stack ด้วย เราใช้วิธีการสร้างลิสต์ในดิกฯ โดย สร้างคลาสชื่อ ComplexDict ดังนี้
ComplexDict
class ComplexDict: def __init__(self, key): self.__list__ = [] key = str(key) self.__list__.append([key,[]]) def add_key(self, key): if not self.has_key(key): self.__list__.append([key,[]]) def __repr__(self): return repr(dict(self.__list__)) def __getitem__(self, key): _keys = self.keys() if key in _keys: index = _keys.index(key) return self.__list__[index][1] def __delitem__(self, key): if self.has_key(key): self[key] = []
มีอีกวิธีนึงในการที่จะให้คลาสลูกเรียกเมธอด __init__ โดยอัตโนมัติ นั่นคือเราจะไม่สร้างเมธอด __init__ ในคลาสลูก แต่สร้างเมธอดใหม่ที่เมธอด __init__ จะมาเรียกใช้อีกทีนึง
__init__
ตัวอย่าง
>>> class X: ... def __init__(self,*argv,**keyw): ... if len(self.__class__.__bases__) == 0: ... self._parent = None ... else: ... self._parent = self.__class__.__bases__[0] ... print self._parent ... self.init(argv, keyw) ... def init(self,*argv,**keyw): ... pass ... >>> class Y(X): ... def init(self,*argv,**keyw): ... print 'Print from class Y' ... >>> class Z(Y): ... pass ...
ไพธอนไม่สามารถผ่านค่าไปยังฟังก์ชั่นแบบ "ผ่านค่าโดยการอ้างอิง" ได้ มีวิธีโดยอ้อมคือผ่านค่าโดยใช้ list หรือ dictionary ซึ่งเป็น mutable object
>>> def x(i): ... i[0] += 1 ... >>> i = 5 >>> a = [i] >>> x(a) >>> a [6] >>> i = a[0] >>> i 6
ข้อมูลชนิดดิกชันนารี่ของไพธอน ดีหลายอย่าง แต่เสียตรงไม่สามารถทำงานแบบ Stack (First in, Last out) ได้
ลองเขียนคลาสง่าย ๆ สร้าง tuple ใน list เพื่อเลียนแบบดิกชันนารี่ที่สามารถเก็บข้อมูลเป็น stack ได้
tuple
list
class StackDict: def __init__(self): self.data = [] self._keys = [] self._items = [] def __repr__(self): return repr(dict(self.data)) def __setitem__(self, key, item): if key in self._keys: index = self._keys.index(key) self.data[index] = (key, item) self._items[index] = item else: self.data.append((key, item)) self._keys.append(key) self._items.append(item)
There are currently 0 users online.
Recent comments