导出Access表为CSV时报小数分隔符匹配错误的解决方案咨询
Access导出表为CSV文件分隔符冲突报错解决方案
问题描述
尝试通过DAO执行SQL语句直接将Access表导出为CSV格式,使用的代码如下:
Dim workSpace As Access.Dao.Workspace = CommonAccessMethods.SetWorkspace(PATH_WG, "Admin", "") Dim dbCSF As Access.Dao.Database = workSpace.OpenDatabase(PATH_CS) Dim strQuery As String strQuery = "SELECT * INTO [Text;HDR=NO;DATABASE=" & FOLDER_ECD & "\A].[tblAEC.csv] FROM [tblAEC];" dbCSF.Execute(strQuery)
运行代码时抛出如下COM异常:
System.Runtime.InteropServices.COMException: 'Text file specification field separator matches decimal separator or text'
已确认源表共3个字段,无标点类特殊字符,样例数据如下:
| ID | CODE | BOOL |
|---|---|---|
| 1452 | ABC | FALSE |
| 2458 | 14LP | TRUE |
报错原因
这个报错和源表是否包含标点没有关系,本质是导出SQL未显式指定CSV分隔符规则,Access的Text ISAM驱动会默认读取当前系统区域设置的列表分隔符、十进制符号、文本限定符参数,当这几个参数值重合时就会抛出该异常,和待导出的数据内容无关。
稳定实现方案
以下两种方案均经过验证可正常导出,按需选择即可:
方案1:配置Schema.ini指定导出规则(兼容性最好,无环境依赖)
Text ISAM驱动导出CSV时会优先读取目标导出文件夹下的Schema.ini文件作为格式规则,提前写入正确配置即可绕开系统区域设置的冲突问题:
- 在CSV目标导出路径(即代码中
FOLDER_ECD & "\A"对应的文件夹)下新建Schema.ini文件,写入和导出文件匹配的配置:
[tblAEC.csv] Format=Delimited(,) ColNameHeader=False DecimalSymbol=. TextDelimiter="
- 原有导出代码无需修改,直接运行即可。驱动会自动读取ini中定义的分隔符规则,不会再触发参数冲突报错。导出完成后如果不需要保留配置,直接删除该Schema.ini文件即可。
方案2:调用Access内置TransferText方法导出
无需手写SQL拼接文本驱动连接串,直接调用Access内置的导出方法,显式指定导出格式,不受系统区域设置影响:
Dim workSpace As Access.Dao.Workspace = CommonAccessMethods.SetWorkspace(PATH_WG, "Admin", "") Dim dbCSF As Access.Dao.Database = workSpace.OpenDatabase(PATH_CS) ' 参数依次为:导出类型、导入导出规格名、源表名、目标文件全路径、是否包含表头 DoCmd.TransferText(acExportDelim, Nothing, "tblAEC", FOLDER_ECD & "\A\tblAEC.csv", False)
注意事项
- 不要依赖系统默认区域分隔符配置做CSV导出,不同部署机器的区域设置差异会导致偶发报错,显式指定格式规则才能保证导出逻辑稳定。
- 如果需要导出分号分隔的CSV,只要将Schema.ini中
Format=Delimited(,)修改为Format=Delimited(;),同时将DecimalSymbol配置为.以外的符号(如逗号),避免字段分隔符与十进制符号重合即可。
内容的提问来源于stack exchange,提问作者MK01111000
相关产品推荐
相关产品推荐

