在vba中读取csv文件而不是移动到下一个记录,而不是下一个列

时间:2015-07-29 17:52:45

标签: vba

以下是Access应用程序的代码。正在发生的是正在读取包含记录的csv文件。如果不满足正确的条件,则程序需要转到csv文件中的下一条记录并继续处理。然而,当这种情况发生在" GoTo NEXT_RECORD"它会立即跳转到" NEXT_RECORD:Wend"并重新开始循环。但是,它不是读取下一个记录而是读取下一列。我需要知道如何将指针移动到下一个记录而不是下一列。任何帮助表示赞赏。

Public Sub ReadCSV()

    Const FILE_NAME = "C:\files\test.csv"

    On Error GoTo EH

    Dim sX As String
    Dim sSSN As String
    Dim sName As String

    Open FILE_NAME For Input As #1

    'read to the end of the line to skip header row
    While sX <> Chr(13)
        sX = Input(1, #1)
    Wend
    sX = Input(1, #1)

    While Not EOF(1)

        Input #1, sSSN

        If Len(sSSN) <> 11 Then
            Debug.Print "bad SSN: " & sSSN
            GoTo NEXT_RECORD
        End If

        Input #1, sName
        Debug.Print sSSN & vbTab & sName

NEXT_RECORD:
    Wend

    GoTo FINISH
EH:
    With Err
        MsgBox .Number & vbCrLf & .Source & vbCrLf & .Description
        .Clear
    End With

FINISH:
    Close #1
End Sub

CSV文件包含以下记录:

SSN,Name
684-92-4567,Marshall Applewhite
55589,Shoko Ashara
874-96-5124,Jim Jones

1 个答案:

答案 0 :(得分:1)

<强>解决方案

在恢复循环之前读取到行尾。这将绕过其他领域。下面是一些代码,它使用输入函数一次读取一个字符,直到它返回到回车符(字符13)。然后它再读取一个字符以绕过换行符(字符10)。 Windows使用Chr(13)和Chr(10)的组合进行行结束。

将以下行放在Goto之前,所以它们看起来像这样:

'read to the end of the line
sX = ""
While sX <> Chr(13)
    sX = Input(1, #1)
Wend
sX = Input(1, #1)

'now safe to move to next record
GoTo NEXT_RECORD

这是对例程开头的几行代码的重复,它们为了跳过CSV的标题行而做同样的事情。

Input#Statement用于一次读取一个字段(它读取逗号或行尾),这就是为什么在恢复之前跳到结尾的原因。

<强>参考