【问题标题】:Transfering CSV as a pure text table将 CSV 作为纯文本表传输
【发布时间】:2014-03-18 14:56:52
【问题描述】:

我目前正在使用 VBA 脚本将 CSV 表传输到 Access(从 Excel 内部)

objAccess.DoCmd.TransferText acImportDelim, "", _
        "table1", "C:\donPablo\StackOverFlow\StackCSV.csv", True

问题是 Access 错误地为我的列定义了类型。 我的一些列有文本和数字行,这就是为什么一半的导入损坏并出现错误代码:“类型转换失败”

我在网上看到你可以解决这个问题

  • 使用完全相同的名称和预定义的列类型创建表

objAccess.DoCmd.RunSQL "CREATE TABLE" + cstrTable + "(id Text);"

那没用。同样的错误。

  • 将文本类型的第一列添加到 CSV 文件中 所以我添加了一行是 100% 的文本。同样的错误。

似乎 Access 内部正在进行某种“聪明”的转换,我无法绕过它。 绕过此转换的唯一可能方案是使用此逻辑转换 CSV 文件中的所有条目:

之前:

value1,value2,"value3",value4

之后

"value1","value2","value3","value4"

有没有办法做这个操作?也许某种正则表达式?

【问题讨论】:

  • 您是否尝试过使用保存的import specification 导入?
  • @HansUp 不,没有使用任何规范。我有 15 个表,为了创建规范 - 我需要手动导入每个 CVS。那是对的吗?我希望有一种方法可以将所有列定义为文本,而无需手动导入每个表..
  • 视情况而定。导入规范不绑定到特定的 CSV 文件名或特定的 Access 表名。它基本上将字段名称和数据类型从源映射到目标。因此,如果所有 15 个 CSV 文件和所有 15 个表都使用相同的结构,那么您只需要一个导入规范。
  • 每个表都有不同的列,具有不同的名称和值。无论如何,我已经添加了解决方案的答案;)

标签: vba ms-access type-conversion


【解决方案1】:

我为上述问题创建了一个硬编码解决方案(无正则表达式)

        Dim current_Char As Variant
        ignoretext = False

        For Counter = 1 To Len(currentLine)
            current_Char = Mid(currentLine, Counter, 1)
            next_Char = Mid(currentLine, Counter + 1, 1)

            If ignoretext = False And current_Char = """" Then 'opening of existing quote
                ignoretext = True
                newLine = newLine & current_Char
            ElseIf ignoretext = True And current_Char = """" Then 'ending of existing quote
                ignoretext = False
                newLine = newLine & current_Char
            ElseIf ignoretext = True Then
                newLine = newLine & current_Char
            ElseIf ignoretext = False Then

                If current_Char = "," Then

                    If last_Char <> """" Then
                        newLine = newLine & """"
                    End If

                    newLine = newLine & current_Char

                    If next_Char <> """" Then
                        newLine = newLine & """"
                    End If
                Else
                    newLine = newLine & current_Char
                End If
            Else
               newLine = newLine & current_Char
            End If

            last_Char = current_Char

        Next

        If Mid(currentLine, 1, 1) <> """" Then
            newLine = """" & newLine
        End If

        If Mid(currentLine, Len(currentLine), 1) <> """" Then
            newLine = newLine & """"
        End If

可能缺少一些变量定义,但逻辑仍然存在;)

基本上是做什么的:

之前

"fsdf, dfafs",val,",fsd",156,fsd

之后

"fsdf, dfafs","val",",fsd","156","fsd"

您的所有字段现在都是文本类型 ;)

  • 一旦检测到现有引号,逻辑就会忽略所有逗号
  • 除非找到结束引号,否则它将继续忽略
  • 如果前一个 Char 不是引号,则所有其他逗号逻辑将添加 before_quote
  • 如果下一个字符不是引号,则所有其他逗号逻辑将添加 after_quote
  • 所有其他字符将按原样附加到字符串
  • 最后,在逻辑的最后,我们将根据在提到的位置是否存在现有引号,在字符串的开头或结尾添加引号

玩得开心

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-05-17
    • 1970-01-01
    • 1970-01-01
    • 2012-11-14
    • 2017-06-06
    • 2010-10-20
    相关资源
    最近更新 更多