【问题标题】:Converting .CSV to .DBF(dBASEIII) VFP 6.0, everything becomes memo field将 .CSV 转换为 .DBF(dBASEIII) VFP 6.0,一切都变成了备忘录字段
【发布时间】:2016-03-10 01:26:54
【问题描述】:

我正在尝试使用 python 将 excel 文件转换为 dbf(dBASEIII),我当前的过程是:

  1. 使用 xlrd 将 excel 文件转换为 .csv
  2. 我从 .csv 中取出标题并使用
  3. 取新制作的.csv,使用dbf模块(https://pypi.python.org/pypi/dbf)转换成dbf

我从 csv 文件中删除标题并运行以下命令:

table = dbf.from_csv(origfname, filename='test.dbf', field_names=headers, dbf_type='db3')

截至目前,当流程结束后,所有字段都变成备忘录字段,我如何将它们变成 Char、Date、Number 等字段?

【问题讨论】:

    标签: python visual-foxpro foxpro dbf dbase


    【解决方案1】:

    from_csv 方法仅用于转储到备注字段中。

    如果您想要更多控制权,那么您应该跳过csv 步骤并使用xlrddbfxls 转到dbf

    这将需要更多的工作:您必须首先使用适当的字段创建表,但随后只需遍历 xls 表并写入 dbf 表即可。

    所以是这样的:

    some_table = Dbf.Table(
            'whatever.dbf',
            'name C(25); age N(3); history M',
            codepage='cp1252',
            )
    
    # get data from xlrd (specifics are not correct, psuedo-code only)
    ...
    data = []
    for row in sheet:
        for cell in row:
            data.append(cell.value)
        # back to real code
        some_table.append(tuple(data))
     # all data has been transferred
     some_table.close()
    

    要自动生成字段名称和列类型,您需要循环浏览电子表格的前几行以获取标题名称和值类型。这是我迭代的一个示例数据行:

    <type 'unicode'> u'PROD'
    <type 'unicode'> u'cclark'
    <type 'float'> 4.0
    <type 'float'> 99.0
    <type 'unicode'> u'501302'
    <type 'unicode'> u'244026'
    <type 'int'> 1
    <type 'float'> 42444.0
    <type 'str'> ''
    <type 'unicode'> u'AB'
    

    【讨论】:

    • 我想接下来的问题是,当我使用 Excel 2003 进行转换时,我不必定义列的宽度。你知道 Excel 用来确定适当宽度的约定吗?
    • @JonNgo:Excel 中的width 是可视的,而不是对存储数据的限制。如果您关心的是正确存储float 字段,那么您可能需要使用vfp 类型(版本3 是默认值),它可以让您指定B(双精度浮点)类型。创建表时使用dbf_type='vfp'
    • 我对你的意思有点困惑,抱歉不是 FoxPro 专家。因此,我将尝试再次解释我的意思。当我在 Excel 中将 .xls 保存到 .dbf(dBaseIII) 并在 FoxPro 中打开后续 dbf 时,当我修改 stru 时,每列将被分配一个类型(Num、Char、Date 等......)和任意宽度。我想我的意思是我希望我的 python 程序与 Excel 2003 将 .xls 转换为 .dbf(dBaseIII) 的方式几乎相同
    • @JonNgo:啊,我误解了你的问题。我不知道 Excel 使用什么过程,但您应该可以通过检查 xlrd 返回的值的类型来大致完成相同的操作(应该是 datefloat 等)我会稍后尝试在我的答案中加入更全面的内容。
    • @JonNgo:更新答案。
    猜你喜欢
    • 2013-11-03
    • 2011-04-23
    • 2012-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-21
    • 2020-03-07
    相关资源
    最近更新 更多