Hi,
This is a small class I made to learn about strings and collections it will allow you to load a basic csv file and view the field values. This is my first try so any comments are welcome.
At the moment it does not support quoted string as i am not sure how to do this but i will try and work on it this week, but for now here is what I made so far, Hope the code maybe of use to someone.
Start vb and add a new class call it bCsv then add the code
Code:
'Bens CSV Reader v1.0
'Created Sunday 28/3/2010 19:23
'This stores all the rows
Private csvLines As Collection
'File to process
Private mFilename As String
'Number of rows
Private mRows As Long
'Number of fields
Private mFields As Long
'Delimiter
Private mDelimiter As String
Private Sub Class_Terminate()
Set csvLines = Nothing
End Sub
Public Property Get Filename() As String
Filename = mFilename
End Property
Public Property Let Filename(ByVal NewFilename As String)
Dim fp As Long
Dim sLine As String
Dim fd() As String
Dim sPos As Integer
'This sub is used to load the csv file
'Add default delimiter if not found
Delimiter = IIf(Len(Delimiter) = 0, ",", Delimiter)
'Create new collection object
Set csvLines = New Collection
'Get free file
fp = FreeFile
'Open the file for reading
Open NewFilename For Input As #fp
Do While Not EOF(fp)
'Read in one line
Line Input #fp, sLine
'Trim down the line
sLine = Trim$(sLine)
'Check for Delimiters
sPos = InStr(1, sLine, Delimiter, vbBinaryCompare)
'Check that we have a row
If Len(sLine) And (sPos > 0) Then
'Add row to collection
Call csvLines.Add(sLine)
'Check if we have the first row
If (csvLines.Count = 1) Then
'Find out the number of fields
fd = Split(sLine, Delimiter)
'Store count
mFields = UBound(fd)
End If
End If
Loop
Close #fp
'Clear up
Erase fd
sLine = vbNullString
End Property
Public Property Get Rows() As Long
'This returns the number of rows
Rows = csvLines.Count
End Property
Public Property Get Fields() As Long
'This returns the number of fields
Fields = mFields
End Property
Public Property Get Delimiter() As String
Delimiter = mDelimiter
End Property
Public Property Let Delimiter(ByVal NewDelimiter As String)
mDelimiter = NewDelimiter
End Property
Public Property Get GetCell(ByVal Row As Long, ByVal Cell As Long) As String
Dim fdItems() As String
'Test that we not going over row count
If (Row > Rows) Or (Row < 1) Then
Call Err.Raise(9)
Exit Property
ElseIf (Cell < 1) Or (Cell > Fields + 1) Then
Call Err.Raise(9)
Exit Property
Else
'Split up the fields
fdItems = Split(csvLines(Row), Delimiter)
'Return the value from the fields
GetCell = fdItems(Cell - 1)
End If
'Clear up time
Erase fdItems
End Property
Here is an example of the csv file i used for testing.
Code:
Red,Blue,Green
Visual Basic,Delphi
Cats,Dogs,Mice
Test1,Test2,VB Rocks
Save the above file to c:\test.csv then add this code to command button.
Code:
Dim Count As Integer
Dim mycsv As New bCsv
With mycsv
'Delimiter to split fields with
.Delimiter = ","
'Filename to load
.Filename = "C:\test.csv"
'Loop tho the records and show the first field value
For Count = 1 To .Rows
MsgBox .GetCell(Count, 1)
Next Count
End With