【发布时间】:2017-01-08 09:44:21
【问题描述】:
我的目标是自动将 .csv 文件导入 Access 表,保留 csv 文件中的所有数据,特别是前导零。
csv 文件每次都会有不同数量的列,因此必须动态创建需要导入的表。 此外,还决定将每一列定义为 text(255)。
这是该过程的相关代码,省略了用户导航到文件夹并选择 .csv 文件的部分。
变量说明:
FilePathAndName 包含 .csv 文件的完整路径和文件名
TableName 包含我正在创建的 MSAccess 表的名称
HeaderRow 包含具有列名的 csv 文件的第一行。列名永远不会包含逗号。
ColumnNames() 是一个数组,用于保存列名本身。
SQLStatement 将保存 SQL DDL 语句来创建表
Open FilePathAndName For Input As #1
' read first row to get column names because that will change every time
Line Input #1, HeaderRow
Close #1
ColumnNames = Split(HeaderRow, ",")
' create MSAccess table via DDL commands
TableName = "GROUPS_TEST"
SQLStatement = "CREATE TABLE " & TableName & "("
For i = 0 To UBound(ColumnNames)
SQLStatement = SQLStatement & "[" & ColumnNames(i) & "] text(255)"
If i < UBound(ColumnNames) Then
SQLStatement = SQLStatement & ", "
End If
Next i
SQLStatement = SQLStatement & ")"
DoCmd.RunSQL SQLStatement
' load .csv file into the table that was just created
DoCmd.TransferText acImportDelim, , TableName, FilePathAndName, True
它可以完美地工作,包括创建表的 DoCmd.RunSQL 语句。 所有列都定义为 text(255),因为有些列必须保留前导零。 它们不是数字;它们是字母数字值。 然后麻烦就开始了。我执行 TransferText 操作并将数据从 .csv 文件导入到表中。 除了它从具有它们的值中去除前导零 即使我专门将所有列定义为 TEXT 列。
我已经用谷歌搜索了几个小时,但没有任何结果。 由于 .csv 文件的动态特性,我没有导入/导出规范。 而且我不知道这会有什么不同。
提到的一件事是在 MSAccess 中编辑文本文件的注册表设置,但我找不到细节。 我正在使用 Access 2007。 提出的另一个想法是使用 schema.ini 文件,但由于 csv 文件的动态特性,我不知道这是否可行。
我们将不胜感激地接受任何帮助。 提前致谢。
【问题讨论】:
-
前导零是动态的还是字段长度是固定的?如果已修复,您可以设置列格式属性以保留前导零
-
既然您正在读取文件以获取列数,那么是什么阻止您遍历该行并插入所有行?我知道这不是你想要的答案,只是说。顺便提一句。如果您真的想解决此问题,请在您的 .csv 文件顶部添加一个空/测试行,其中所有 comumns 都有文本值。它将强制访问以文本形式读取所有列,否则 Access 会在传输时转换列,而您的列是它的副作用之一。
-
@random_answer_guy - 前导零是动态的。
-
@krishKM - 是的,我希望避免遍历文件;相反,我想将其“批量插入”到表中。而且,我尝试在标题行之后插入一个测试行,其中包含有问题的列的非数字值。没有运气。它仍然剥离了后续行的前导零。感谢您的意见!
-
这个问题很熟悉,但不知道我是怎么做到的。我认为访问评估第一行或前 10 行来识别数据类型。 (我知道它很愚蠢)如果你真的想确定,只需逐行插入,至少你知道你做了什么..
标签: csv ms-access import vba leading-zero