0

新しいフィールドを追加したい dbf ファイルがいくつかあります。そのために、dbfpyを使用して元の dbf を開き、すべてのフィールド (または保持したいフィールド) とレコードをコピーしてから、それらのフィールドと必要な新しいフィールドを含む新しいファイルを作成します。1 つの細かい点を除いて、すべてがうまく機能しています。元のフィールドの型を取得する方法がわからないため、元のフィールドの型を保持することができません。私がやっていることは、新しいファイルのすべてのフィールドを「C」(文字) として作成することです。これは、今のところ必要なもので機能しますが、最終的には問題になる可能性があります。

本当の問題は、利用可能なドキュメントがないことです。パッケージファイルを検索してそこにある例を探しましたが、この質問に対する答えが見つかりませんでした (「緑がかった」だけでは見つけられなかった可能性があります) 私はまだ python を使用しています... 私は間違いなく専門家ではありません)。

コードの例:

from dbfpy import dbf
import sys

org_db_file = str(sys.argv[1])
org_db = dbf.Dbf(org_db_file, new = False)

new_db_file = str(sys.argv[2])
new_db = dbf.Dbf(new_db_file, new = True)

#Obtain original field names:
fldnames = []
fldsize = {}
for names in org_db.fieldNames:
  fldnames.append(names)
  fldsize[name] = 0

#Cycle thru table entries:
for rec in org_db:

  #Cycle thru columns to obtain fields' name and value:
  for name in fldnames:
    value = str(rec[name])
    if len(value) > fldsize[name]:
      fldsize[name] = len(value)

#Copy original fields to new table:
for names in fldnames:
  new_db.addField((names, "C", fldsize[name]))

#Add new fields:
new_fieldname = "some_name"
new_db.addField((new_fieldname, "C", 2))

#Copy original entries and store new values:
for rec in org_db:

  #Create new record instance for new table:
  new_rec = new_db.newRecord()

  #Populate fields:
  for field in fldnames:
    new_rec[field] = rec[field]

  #Store value of new field for record i:
  new_rec[new_fieldname] = "some_value"
  new_rec.store()    

new_db.close()

お時間をいただきありがとうございます。乾杯。

4

1 に答える 1

1

数年前に最初に見に行ったときを除いて、dbfpy の経験はありません (および他のいくつかの) dbfpy は私のニーズを満たしていませんでした。 だから私は自分自身を書きました。

これを使用してタスクを達成する方法は次のとおりです。

import dbf
import sys

org_db_file = sys.argv[1]
org_db = dbf.Table(org_db_file)

new_db_file = sys.argv[2]
# postpone until we have the field names...
# new_db = dbf.Dbf(new_db_file, new = True)

# Obtain original field list:
fields = org_db.field_names
for field in fields[:]:  # cycle through a separate list
    if field == "something we don't like":
        fields.remove(field)

# now get definitions for fields we keep
field_defs = ord_db.structure(fields)

# Add new fields:
field_defs.append("some_name C(2)")

# now create new table
new_db = ord_db.new(new_db_file, field_specs=field_defs)

# open both tables
with dbf.Tables(ord_db, new_db):

    # Copy original entries and store new values:
    for rec in org_db:

        # Create new record instance for new table:
        new_db.append()

        # Populate fields:
        with new_db.last_record as new_rec:
            for field in new_db.field_names:
                new_rec[field] = rec[field]

                # Store value of new field for record i:
                new_rec[new_fieldname] = "some_value"
于 2013-03-01T01:36:34.090 に答える