2

我使用 oledb 驱动程序从 csv/txt 文件中检索数据

ConnString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source = " & System.IO.Path.GetDirectoryName(strFileName) & "; Extended Properties = ""Text;HDR=YES;FMT=Delimited"""

strQuery = "SELECT * FROM [" & System.IO.Path.GetFileName(strFileName) & "]"

在最后一行中,如果文件名很大,我会收到以下错误

不是有效的名称。确保它不包含无效字符或标点符号,并且不要太长。

我的问题 - 文件名或选择查询是否有任何限制,或者我需要遵循一些模式?

4

4 回答 4

3

刚刚为此苦苦挣扎,我发现文件路径或名称的任何部分都不能包含空格或单引号,否则文件路径将被确定为无效。这适用于我尝试的名称的任何限定或转义。

删除所有空格和单引号后,一切都很好。例如。

无效的:

"C:\Users\Administrator\Documents\Data\User''s Folder\Import Data.csv"

有效的:

C:\Users\Administrator\Documents\Data\Users-Folder\ImportData.csv
于 2016-04-10T08:40:37.327 回答
1

一些实验表明,没有扩展名的文件名不能包含“.”。所以,MyData.csv是一个有效的文件名,但My.Data.csv不是。

于 2012-05-04T10:55:51.643 回答
1

这是从 Avi 无耻地偷来的答案,这就是它是社区 wiki 的原因:

我建议查看.Net 中内置的TextFieldParserClass而不是使用 Oledb。你需要包括

Imports Microsoft.VisualBasic.FileIO.TextFieldParser

这是一个快速示例:

        Dim afile As FileIO.TextFieldParser = New _
          FileIO.TextFieldParser(FileName)
        Dim CurrentRecord As String() ' this array will hold each line of data '
        afile.TextFieldType = FileIO.FieldType.Delimited
        afile.Delimiters = New String() {","}
        afile.HasFieldsEnclosedInQuotes = True

        ' parse the actual file '
        Do While Not afile.EndOfData
            Try
                CurrentRecord = afile.ReadFields
            Catch ex As FileIO.MalformedLineException
                Stop
            End Try
        Loop

我已经对我借来的答案投了赞成票

于 2010-01-04T12:28:51.280 回答
0

我没有完全找出问题所在,但很明显,长文件名造成了问题,所以这就是我所做的

ConnString = "Provider=Microsoft.Jet.OleDb.4.0; Data Source = " & System.IO.Path.GetDirectoryName(strFileName) & "; Extended Properties = ""Text;HDR=YES;FMT=Delimited"""

    '=================================== OleDB Supports fixed length file name. Handle long file names'
    Dim OldFileName As String = System.IO.Path.GetFileName(strFileName)
    Dim NewFileName As String = Guid.NewGuid().ToString().Substring(0, 10) + System.IO.Path.GetExtension(OldFileName)
    Dim rootPath As String = System.IO.Path.GetDirectoryName(strFileName) + "/"

    'Rename file name'
    My.Computer.FileSystem.RenameFile(rootPath + OldFileName, NewFileName)
    strFileName = rootPath + NewFileName
    '===================================='

    Dim strQuery As String
    strQuery = "SELECT * FROM [" & System.IO.Path.GetFileName(strFileName) & "]"

    'Revert rename file name'
    '===================================================================='
    My.Computer.FileSystem.RenameFile(rootPath + NewFileName, OldFileName)
    strFileName = rootPath + OldFileName
    '===================================================================='

我只是用新的 Guid 重命名了文件,而在将数据重命名回原始文件名后检索数据。

这不是我想要的,我仍在寻找更好的解决方案。如果有人找到,请发布。

谢谢

于 2010-01-06T16:12:22.607 回答