将CSV转换为纯文本表

时间:2014-03-18 14:56:52

标签: vba ms-access type-conversion

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

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

问题是Access错误地为我的列定义了类型。 我的一些列包含文本和数字行,这就是为什么有一半导入被错误代码损坏的原因:"类型转换失败"

我已经在网上看到你可以通过

解决这个问题
  • 使用完全相同的名称和列的预定义类型创建表
  

objAccess.DoCmd.RunSQL"创建表" + cstrTable +"(id Text);"

那不起作用。同样的错误。

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

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

在:

  

value1,value2," value3",value4

  

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

有没有办法做这个操作?某种正则表达式可能吗?

1 个答案:

答案 0 :(得分: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

某些变量定义可能会丢失,但逻辑仍然存在;)

基本上是做什么的:

  

&#34; fsdf,dfafs&#34;,val,&#34;,fsd&#34;,156,fsd

  

&#34; fsdf,dfafs&#34;,&#34; val&#34;,&#34;,fsd&#34;,&#34; 156&#34;,&#34; fsd&#34;

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

  • 逻辑在检测到现有引用后忽略所有逗号
  • 除非找到结束报价,否则将继续忽略
  • 对于所有其他逗号逻辑,如果之前的Char不是引用,则会添加before_quote
  • 对于所有其他逗号逻辑将添加after_quote,如果下一个Char不是引用
  • 所有其他字符将附加到字符串AS IS
  • 最后,在逻辑结束时,我们将在字符串的开头或结尾添加引号,具体取决于在提到的位置是否存在现有引号

玩得开心