Want VBA in excel to read very large CSV and create output file of a small subset of the CSV

前端 未结 7 1985
故里飘歌
故里飘歌 2020-11-30 08:18

I have a csv file of 1.2 million records of text. The alphanumeric fields are wrapped in quotation marks, the date/time or numeric fields are not.

For example \"Fre

7条回答
  •  醉酒成梦
    2020-11-30 08:53

    The following code should do the trick. I don't have Excel in front of me, so I haven't tested it, but the concept is sound.

    If this ends up being too slow, we can look at ways to improve the efficiency.

    Sub SelectSomeRecords()
        Dim testLine As String
    
        Open inputFileName For Input As #1
        Open outputFileName For Output As #2
    
        While Not EOF(1)
            Line Input #1, testLine
            If RecordIsInteresting(testLine) Then
                Print #2, testLine
            End If
        Wend
    
        Close #1
        Close #2
    End Sub
    
    Function RecordIsInteresting(recordLine As String) As Boolean
        Dim lineItems(1 to 8) As String
    
        GetRecordItems(lineItems(), recordLine)
    
        ''// do your custom checking here:
        RecordIsInteresting = lineItems(8) = "LS1 7AA"
    End Function
    
    Sub GetRecordItems(items() As String, recordLine as String)
        Dim finishString as Boolean
        Dim itemString as String
        Dim itemIndex as Integer
        Dim charIndex as Long
        Dim inQuote as Boolean
        Dim testChar as String
    
        inQuote = False
        charIndex = 1
        itemIndex = 1
        itemString = ""
        finishString = False
    
        While charIndex <= Len(recordLine)
            testChar = Mid$(recordLine, charIndex, 1)
    
            finishString = False
    
            If inQuote Then
                If testChar = Chr$(34) Then
                    inQuote = False
                    finishString = True
                    charIndex = charIndex + 1 ''// ignore the next comma
                Else
                    itemString = itemString + testChar
                End If
            Else
                If testChar = Chr$(34) Then
                    inQuote = True
                ElseIf testChar = "," Then
                    finishString = True
                Else
                    itemString = itemString + testChar
                End If
            End If
    
            If finishString Then
                items(itemIndex) = itemString
                itemString = ""
                itemIndex = itemIndex + 1
            End If
    
            charIndex = charIndex + 1
        Wend
    End Sub
    

提交回复
热议问题