【发布时间】:2016-04-11 14:38:33
【问题描述】:
几天来我一直在尝试解决这个问题,但没有成功。非常感谢任何帮助
我正在尝试将 csv 文件导入 Access 数据库,但数字列中的一些数据被截断。
我的机器上没有安装 MS Access(只有 Windows 预装的 jet 数据库引擎 (msjet40.dll and msjetoledb40.dll))。但除了这个问题,其他一切都很好。我在连接字符串中使用Provider=Microsoft.ACE.OLEDB.12.0。
csv 文件在文件中包含数字列和非数字列。只要有问题的数字列的值小于2140649050 左右,它就可以选择。
SELECT * into ds1 FROM [Text;FMT=Delimited;HDR=YES;DATABASE=" & LFPath & "].[" & LFName & "]
最初我假设在将数据加载到表时会发生数据截断。但是数据在选择本身时被截断。以下选择查询返回为 UPC 列截断的部分数据
SELECT HeadName,[upc code],len([upc code]) as maxlen FROM [Text;FMT=Delimited;HDR=YES;DATABASE=" & LFPath & "].[" & LFName & "]
这是相同的输出
HeadName upc code maxlen
TOTAL U.S 2140649030 10
TOTAL U.S 2140649050 10
TOTAL U.S 2140649050 10
TOTAL U.S
TOTAL U.S
TOTAL U.S
TOTAL U.S
TOTAL U.S
似乎它根据最初的几条记录设置了列的最大长度。我怎样才能阻止它这样做。
之所以选择 Access,是因为该工具无需额外设置即可在 Windows 中运行。
安装 MS Access 时数据不会被截断(使用 Access 2010 测试)。这是否意味着 ACE.OLEDB.12 与最新的 ACE 引擎 ACECORE.dll (wiki) 配合使用效果更好
请提出解决问题的任何可能性,而无需安装其他版本的数据库的额外负担
【问题讨论】:
-
尝试使用schema.ini 文件来明确定义列类型应该是什么。看起来 Text 驱动程序假设该列是 Long Integer 并截断超过有符号 32 位整数 (~2.1E9) 的最大值的值。
-
数据文件的列数不固定。所以我现在看到的唯一选择是根据此列按降序对文件进行排序,然后加载。但我想知道是否可以从 vba 中对实际的 csv 文件本身进行排序
标签: csv ms-access ms-jet-ace