【问题标题】:Access 2007 export table to csv decimalAccess 2007 导出表到 csv 十进制
【发布时间】:2012-07-11 02:26:16
【问题描述】:

我尝试将 Access 中的一些表导出到 csv 以便可以导入到 Oracle。我不使用通过 ODBC 导出,因为我在其中一些表中有 70K - 500K 记录,并且该功能需要很长时间,因为我有大约 25 个表要做,所以我想导出到 csv(这要快得多)然后通过 sqlldr 加载。

一些数字列可以达到小数点后 16 位,我需要它们。但是,当我导出它们时,它们只会出现 2。我已经对此进行了一些谷歌搜索。区域设置只允许 9 位小数(Win XP),通过查询格式化列会将其更改为我在导入 Oracle 时不需要的文本(也许我可以在控制文件中使用 to_number()?)。

为什么这么难?为什么 Access 不能按原样导出数字列?

【问题讨论】:

    标签: oracle ms-access decimal


    【解决方案1】:

    在我的 Access 2007 测试用例中,我没有看到您描述的完全相同的结果。当我导出到 CSV 时,我得到所有小数位。

    这是我的示例表,decimal_field 为十进制 (18, 16)。

    id some_text decimal_field
    -- --------- ------------------
     1 a         1.0123456789012345
     2 b                          2
    

    不幸的是,那些导出的 decimal_field 值在 CSV 中被引用:

    "id","some_text","decimal_field"
    1,"a","1.0123456789012345"
    2,"b","2" 
    

    我能找到删除 decimal_field 值周围引号的唯一方法也删除了围绕真实文本值的引号。

    如果引用的数值不可用,也许您可​​以创建一个 VBA 自定义 CSV 导出程序,在其中将值写入您希望格式化的每个文件行。

    关于“为什么这么难?”,我怀疑十进制数据类型是罪魁祸首。我不记得在使用其他数字数据类型时遇到过此类问题。不幸的是,这只是我的猜测,即使它是正确的也无济于事。

    【讨论】:

    • 表格是自动编号的,因此所有表格之间的小数位数是可变的。我通过 Format(Field, "@") 转换为文本,然后通过 to_number() 转换回 sqlldr 控制文件中的数字。这在所有桌子之间都很有效。但是,我确实必须为每个表创建一个查询来进行格式()转换,这很糟糕。我想我可以制作一些 VBA 来自动为我在数字列上执行此操作。
    【解决方案2】:
    1. 创建一个查询,从您的表中选择所有记录。使用格式化函数格式化麻烦的列:
      Select Format(Fieldname,"0000.00000") AS FormattedField
      保存此查询并导出 查询 而不是表。

      这种方法的一个缺点是您的数字字段随后会被视为文本,因此您会在导出的数字周围加上引号,如果您使用不将文本括在引号中的选项,那么您导出的任何实际文本字段相同的查询也会丢失引号

    2. 另一种(更快、更脏、更糟糕的工作)方法是先导出到 Excel,然后再从那里导出到文本。这会保留小数位不变,但显然它不是很优雅。

    【讨论】:

    • 1.每个表可以有可变数量的小数位,给出一定数量是非常糟糕的,因为我可能会把它弄乱并切断一些非常糟糕的小数。最后我使用 Format(field, "@") 转换为文本,然后在 sqlldr 控制文件 to_number() 中将其转换回数字。这样可以确保无论表格还是小数位数,它都会在小数点之后获得所有值,而我不必在之后找到最大的小数位数。注意表格是自动编号的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多