如何使用@作为分隔符和VBA导入csv文件

时间:2014-02-03 11:18:03

标签: excel-vba csv adodb vba excel

我正在尝试使用ADODB从带有VBA的Excel中的csv文件加载数据。 我有一个返回Connection对象的函数。

Private Function OpenConnection(dataSource As String) As ADODB.Connection
    Set OpenConnection = CreateObject("ADODB.Connection")

    With OpenConnection
        .ConnectionTimeout = 5
        .ConnectionString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & dataSource & ";" & _
            "Extended Properties=""Text;HDR=YES;FMT=Delimited(,)"";Persist Security Info=False"

        Debug.Print "trying to connect: " & .ConnectionString
        .Open
    End With
End Function

然后我只打印数据。

Public Sub Test_Import()
    Dim conn As ADODB.connection, records As ADODB.Recordset

    Set connection = OpenConnection(foldername)
    Set records = connection.Execute("Select * from data.txt")

    Debug.Print records.Fields(0)
End Sub

如果我使用逗号它可以正常工作但最后我将不得不使用由'@'符号分隔的文件,而我无法使用'转换为<,> < / strong>因为缺少写入权限 遗憾的是,在其他地方复制和更改文件也不是一种选择。

现在我在FMT=Delimited(,)函数中将FMT=Delimited(@)更改为OpenConnection,而不是返回第一列值a1,而是返回整行a1@b1@c1

'@'不支持作为分隔字符串?或者我错过了什么?

2 个答案:

答案 0 :(得分:4)

感谢@SiddharthRout提供解决方案以及指向a thread at windows dev center的链接。

问题是在连接字符串中,无法设置分隔字符串,只能指定使用特定字符分隔文件。 FMT=Delimited(@)的处理方式与FMT=DelimitedFMT=Delimited(,)相同。

我必须在包含我必须输入的csv文件( data.txt )的文件夹中创建一个文件 schema.ini

[data.txt]
Format = Delimited(@)

将解析schema.ini文件并正确读取分隔符,一切正常(只要我不更改任何文件名)

我还发现another source at msdn解释了如何设置分隔字符串(使用注册表或提到的 schema.ini ),还包括Tabstops和固定长度分隔文件。

答案 1 :(得分:1)

@marcw-您真棒。 为了进一步帮助您-您不必手动创建此文件。 如果您使用的是Filedialog,则可能如下所示:

Set fldr = Application.FileDialog(msoFileDialogOpen)

With fldr
    .Title = "Select a Folder"
    .AllowMultiSelect = False       ' Select only 1 file
    .InitialFileName = strPath      ' File location
    If .Show <> -1 Then Exit Sub    ' Quit when user cancels
    myFolder = .SelectedItems(1)
End With

'you can find below function on stackoverflow
strPath = Left(myFolder, Len(myFolder) - Len(GetFilenameFromPath(myFolder)) - 1) 'file path ended with \
nejm = GetFilenameFromPath(myFolder) 'file name

'this is the place which is creating that "ini" file
Open strPath & "\" & "schema.ini" For Output As #1
Print #1, "[" & nejm & "]" & vbNewLine & "Format = Delimited(;)"
Close #1

完成所有过程后,您只需添加:

Kill strPath & "\" & "schema.ini"