dBASE und Datentypen

Installation und Anwendung von Datenbankschnittstellen wie SQLite, PostgreSQL, MariaDB/MySQL, der DB-API 2.0 und sonstigen Datenbanksystemen.
Antworten
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

Ich hab irgenwie Probleme, in einem DBase-File Spalten anzulegen, die Zahlen beinhalten. Datum Und String sind irgendwie kein Problem. Hab mir auch schon den Code aus dem dbf-Modul angeguckt, aber werde daraus auch nicht so ganz schlau.

Code: Alles auswählen

# Funktioniert alles:
db_file.addField(("Spalte_Char","C",8))
db_file.addField(("Spalte_Date","D"))
db_file.addField(("Spalte_Integer","I"))
Ich kann sogar bei nem Integer Länge des Integers und Anzahl der Dezimalstellen(?) angeben.

Wenn ich nun aber ein Float oder allgemeines Numeric Field erstellen will, MUSS ich zusätzlich zu Anzahl der DEzimalstellen(optional), die Länge angeben. Das verwirrt mich. Wozu soll das gut sein? Und warum?

Wenn ich das frei lasse, oder einfach nichts übergebe, bekomme ich Fehlermeldungen:

Code: Alles auswählen

dbfile.addField(("Spalte_float","F"))

Traceback (most recent call last):
  File "C:\<string>", line 1, in ?
  File "C:\Python24\Lib\site-packages\dbfpy\dbf.py", line 226, in addField
    self.header.addField(*defs)
  File "C:\Python24\Lib\site-packages\dbfpy\header.py", line 214, in addField
    self.recordLength += self._addField(*defs)
  File "C:\Python24\Lib\site-packages\dbfpy\header.py", line 189, in _addField
    ignoreErrors=self._ignore_errors)
  File "C:\Python24\Lib\site-packages\dbfpy\fields.py", line 80, in __init__
    raise ValueError("[%s] Length isn't specified" % name)
ValueError: [TEST5] Length isn't specified
oder

Code: Alles auswählen

dbfile.addField(("Spalte_float","F","",3))


  File "C:\<string>", line 1, in ?
  File "C:\Python24\Lib\site-packages\dbfpy\dbf.py", line 226, in addField
    self.header.addField(*defs)
  File "C:\Python24\Lib\site-packages\dbfpy\header.py", line 214, in addField
    self.recordLength += self._addField(*defs)
  File "C:\Python24\Lib\site-packages\dbfpy\header.py", line 189, in _addField
    ignoreErrors=self._ignore_errors)
  File "C:\Python24\Lib\site-packages\dbfpy\fields.py", line 81, in __init__
    length = int(length)
ValueError: invalid literal for int():
Wenn ich statt "F", "N" benutze, ist es das gleiche :(
BlackJack

Also bei einem Integer ("I") wird die Länge ignoriert, das ist immer ein vorzeichenbehafteter, "little endian"-4-Byte-Wert.

'N' und 'F' sind gleicht. Diese Daten werden als Zeichenkette gespeichert. Dazu muss das Modul wissen wieviele Stellen insgesamt inklusive Dezimalpunkt der Wert haben soll, und wieviele davon die Nachkommastellen sind.

Wenn die Anzahl der Dezimalstellen mit 0 angegeben ist, dann werden ganze Zahlen gespeichert. Auch wieder als Zeichenkette.
meneliel
User
Beiträge: 256
Registriert: Montag 25. Juni 2007, 08:35
Kontaktdaten:

achso .....

Aber das kann ich doch vorher nicht sagen, wie lang die Zahl und damit die Zeichenkette ist, dass kann doch selbst bei konstanter Anzahl der Dezimalstellen schwanken ....
aber es müsste doch dann reichen, wenn ich die maximale Länge angebe, wenn eine Zahl kleiner/kürzer ist, dürfte dass doch dann nicht stören.....?
BlackJack

Natürlich sind das Maximalwerte. :-)

Formatiert wird das im Code so:

Code: Alles auswählen

In [6]: '%*.*f' % (10, 3, 0)
Out[6]: '     0.000'

In [7]: '%*.*f' % (10, 3, 42.23)
Out[7]: '    42.230'
Jetzt ist vielleicht auch klar woher diese Angabe der Gesamtanzahl und Anzahl der Nachkommastellen kommt: von C's `printf()`-Formatierungscodes.
Antworten