使用长号逗号导入逗号分隔的csv文件

时间:2012-02-24 19:31:07

标签: ms-access ms-access-2007

我正在尝试在访问中导入逗号分隔的csv文件。我遇到的问题是“Amount”列之一在数据本身中有逗号,例如“1,433.36”。此数据中总会有逗号。

如何成功导入?

示例数据:

sjonn,one,"1,855.9"
ptele,two,344.0
jrudd,one,334.8

提前致谢

5 个答案:

答案 0 :(得分:1)

我会将分隔符更改为其他字符,例如管道“|”。

答案 1 :(得分:1)

如果DoCmd.TransferText不适合您,那么您可以定义一种“手动”执行此操作的方法:

Set fs = Server.CreateObject("Scripting.FileSystemObject")
Set objFile = fs.GetFile("import.txt")
Set objFileTextStream = objFile.OpenAsTextStream(1, 2)

objFileTextStream.skipLine 'if the file contains the header

Do While objFileTextStream.AtEndOfStream <> True 
    strLine = objFileTextStream.ReadLine 'read a line
    strLinePart = split(strLine,",")  'Split the line using the , delimiter
    firstField = strLinePart(0)
    secondField = strLinePart(1)
    thirdField = strLinePart(2)
    strSQL = "INSERT INTO myTable Values('"& firstField &"','"& secondField &"','"& thirdField &"')"
  conn.Execute strSQL
Loop

objFileTextStream.Close: Set objFileTextStream = Nothing
Set fs = Nothing
conn.Close: Set conn = Nothing 

答案 2 :(得分:0)

将文件另存为制表符分隔的文本文件,然后将其导入。

答案 3 :(得分:0)

使用输入读取文件为您处理引号

Dim f1 As String
Dim f2 As String
Dim f3 As String

Open "d:\test.txt" For Input As #1

Input #1, f1, f2, f3
Debug.Print f1, f2, f3
Input #1, f1, f2, f3
Debug.Print f1, f2, f3

Close #1 '

sjonn         one           1,855.9
ptele         two           344.0

答案 4 :(得分:0)

我曾经遇到过这个问题,这是另一种可能有用的方法,但它会自行拆分行,即在使用此方法之前必须首先将字符串拆分为行 它还假设它包含在一个名为Module1

的模块中
    ''Perfoms a smart split that takes care of the ""
    Public Function SmartSplit(Str As String) As Variant

    ''New collection
    Dim Quote As String
    Dim Delimiter As String
    Dim MyString As String
    Dim Sample As String
    Dim StrCollection As New Collection
    Dim Array_1() As String
    Dim HasSeenQuote As Boolean
    Dim index As Long

    Quote = "" & CStr(Chr(34))
    Delimiter = "" & CStr(Chr(44))
    HasSeenQuote = False



    Array_1 = Split(Str, Delimiter)


    For index = LBound(Array_1) To UBound(Array_1)

    Sample = Array_1(index)

    If Module1.StartsWith(Sample, Quote, False) Then
    HasSeenQuote = True
    End If

    ''We append the string
    If HasSeenQuote Then
    MyString = MyString & "," & Sample
    End If


    ''We add the term
    If Module1.EndsWith(Sample, Quote, False) Then
    HasSeenQuote = False

        MyString = Replace(MyString, Quote, "")
        MyString = Module1.TrimStartEndCharacters(MyString, ",", True)
        MyString = Module1.TrimStartEndCharacters(MyString, Quote, True)
        StrCollection.Add (MyString)
        MyString = ""
        GoTo LoopNext

    End If

    ''We did not see a quote before
    If HasSeenQuote = False Then
            Sample = Module1.TrimStartEndCharacters(Sample, ",", True)
            Sample = Module1.TrimStartEndCharacters(Sample, Quote, True)
            StrCollection.Add (Sample)
    End If


    LoopNext:
    Next index



    ''Copy the contents of the collection
    Dim MyCount As Integer
    MyCount = StrCollection.Count

    Dim RetArr() As String
    ReDim RetArr(0 To MyCount - 1) As String

    Dim X As Integer
    For X = 0 To StrCollection.Count - 1 ''VB Collections start with 1 always
        RetArr(X) = StrCollection(X + 1)
    Next X

    SmartSplit = RetArr

    End Function


    ''Returns true of false if the string starts with a string
    Public Function EndsWith(ByVal Str As String, Search As String, IgnoreCase         As         Boolean) As Boolean

    EndsWith = False
    Dim X As Integer
    X = Len(Search)

    If IgnoreCase Then
    Str = UCase(Str)
    Search = UCase(Search)
    End If


    If Len(Search) <= Len(Str) Then

    EndsWith = StrComp(Right(Str, X), Search, vbBinaryCompare) = 0

    End If


    End Function



    ''Trims start and end characters
    Public Function TrimStartEndCharacters(ByVal Str As String, ByVal Search As         String, ByVal IgnoreCase As Boolean) As String

    If Module1.StartsWith(Str, Search, IgnoreCase) Then
     Str = Right(Str, (Len(Str) - Len(Search)))
    End If

    If Module1.EndsWith(Str, Search, IgnoreCase) Then
        Str = Left(Str, (Len(Str) - Len(Search)))
    End If

    TrimStartEndCharacters = Str

    End Function


    ''Returns true of false if the string starts with a string
    Public Function StartsWith(ByVal Str As String, Search As String, IgnoreCase As Boolean) As Boolean

    StartsWith = False
    Dim X As Integer
    X = Len(Search)

    If IgnoreCase Then
    Str = UCase(Str)
    Search = UCase(Search)
    End If


    If Len(Search) <= Len(Str) Then

    StartsWith = StrComp(Left(Str, X), Search, vbBinaryCompare) = 0

    End If


    End Function