Solved

vb.net reading CSV file - null exception

Posted on 2014-11-13
6
512 Views
Last Modified: 2014-11-14
Hello Experts
I am trying to parse CSV file which has 2 rows of data, its reading the first line correctly, storing in the structure variable but when I loop it through the second time, it errors when I try to read the first column (fields(0))

"Object reference not set to an instance of an object."

please can someone advice what is wrong with this code?

  Private Function ParseCSVs() As Boolean

        Dim LocalFilePath As String = String.Empty

        For Each aCSV As xCSV In _CSVs
            LocalFilePath = My.Settings.Item("GRFiles") & "DailyOrders\" & aCSV.CSVFileName
        
            Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(LocalFilePath)

                MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
                MyReader.Delimiters = New String() {","}  '{vbTab}
                Dim currentRow As String()
                'Loop through all of the fields in the file.  
                'If any lines are corrupt, report an error and continue parsing.  
                Dim OrderRequest As New cCSVOrderRequest
                OrderRequest.Items = New List(Of cCSVProductItem)

                Dim Product As ProductClass = Nothing
                Dim Item As cCSVProductItem = Nothing
                While Not MyReader.EndOfData
                    Try

                        currentRow = MyReader.ReadFields()
                        ' Include code here to handle the row. 
                        Dim fields As String() = MyReader.ReadFields()
                        Item = New cCSVProductItem()
                        Item.OrderItemNumber = fields(0)
                        Item.PartNumber = fields(2)
                        Item.Description = fields(3)
                        Item.Quantity = fields(4)
                        Item.ShipTitle = fields(17)
                        Item.ShipToName = fields(18)
                        Item.ShipAddress1 = fields(19)
                        Item.ShipAddress2 = fields(20)
                        Item.ShipAddress3 = fields(21)
                        Item.ShipAddress4 = fields(22)
                        If fields(23).Contains("GB") Then
                            Item.ShipCountry = "238"
                        Else
                            Item.ShipCountry = ""
                            'CommonFunctions.SendErrorEmail("")
                        End If
                        Item.ShipPostCode = fields(24)
                        Item.PhoneNumber = fields(28)
                        OrderRequest.Items.Add(Item)
                    Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                        'CommonFunctions.SendErrorEmail("")
                        Return False
                    End Try
                End While
                aCSV.OrderRequest = OrderRequest
            End Using
        Next
        Return True
    End Function

Open in new window

Untitled.png
0
Comment
Question by:mehmast
  • 3
  • 2
6 Comments
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 40440689
That is because you are reading both rows in the first pass and therefore when you try to get the next row there is no more data, fields(0) is null and you are trying to assign that to a variable in this line of code.

 Item.OrderItemNumber = fields(0)

This is where you are reading in both lines in the file in the first pass. Modify the code to read once per pass.

Try
    '' First time you read the line from the file
    currentRow = MyReader.ReadFields()
    ' Include code here to handle the row. 
    
    '' Now you fread the second line in from the file 
    Dim fields As String() = MyReader.ReadFields()

Open in new window

0
 

Author Comment

by:mehmast
ID: 40440847
Hello
thank you for picking this up for me
i have headers in first row, so this line will ignore the headers
currentRow = MyReader.ReadFields()

the second and the third rows has data which I want to extract,

how can i make sure i only run the headers once in the loop? please advice
0
 

Assisted Solution

by:john hill
john hill earned 100 total points
ID: 40440867
something like this?


 Private Function ParseCSVs() As Boolean

        Dim LocalFilePath As String = String.Empty

        For Each aCSV As xCSV In _CSVs
            LocalFilePath = My.Settings.Item("GRFiles") & "DailyOrders\" & aCSV.CSVFileName
        
            Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(LocalFilePath)

                MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
                MyReader.Delimiters = New String() {","}  '{vbTab}
                Dim currentRow As String()
                'Loop through all of the fields in the file.  
                'If any lines are corrupt, report an error and continue parsing.  
                Dim OrderRequest As New cCSVOrderRequest
                OrderRequest.Items = New List(Of cCSVProductItem)

                Dim Product As ProductClass = Nothing
                Dim Item As cCSVProductItem = Nothing
  Dim Cntr As Integer = 1
                While Not MyReader.EndOfData
                    Try

                      If Cntr = 1 Then
                            currentRow = MyReader.ReadFields()
                        End If
                        ' Include code here to handle the row. 
                        Dim fields As String() = MyReader.ReadFields()
                        Item = New cCSVProductItem()
                        Item.OrderItemNumber = fields(0)
                        Item.PartNumber = fields(2)
                        Item.Description = fields(3)
                        Item.Quantity = fields(4)
                        Item.ShipTitle = fields(17)
                        Item.ShipToName = fields(18)
                        Item.ShipAddress1 = fields(19)
                        Item.ShipAddress2 = fields(20)
                        Item.ShipAddress3 = fields(21)
                        Item.ShipAddress4 = fields(22)
                        If fields(23).Contains("GB") Then
                            Item.ShipCountry = "238"
                        Else
                            Item.ShipCountry = ""
                            'CommonFunctions.SendErrorEmail("")
                        End If
                        Item.ShipPostCode = fields(24)
                        Item.PhoneNumber = fields(28)
                        OrderRequest.Items.Add(Item)
Cntr = Cntr + 1
                    Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                        'CommonFunctions.SendErrorEmail("")
                        Return False
                    End Try
                End While
                aCSV.OrderRequest = OrderRequest
            End Using
        Next
        Return True
    End Function

                                

Open in new window

0
Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

 
LVL 63

Accepted Solution

by:
Fernando Soto earned 400 total points
ID: 40440916
Hi mehmast;

Then move the first read line just before the while loop and shown below.

Private Function ParseCSVs() As Boolean

    Dim LocalFilePath As String = String.Empty

    For Each aCSV As xCSV In _CSVs
        LocalFilePath = My.Settings.Item("GRFiles") & "DailyOrders\" & aCSV.CSVFileName
    
        Using MyReader As New Microsoft.VisualBasic.FileIO.TextFieldParser(LocalFilePath)

            MyReader.TextFieldType = Microsoft.VisualBasic.FileIO.FieldType.Delimited
            MyReader.Delimiters = New String() {","}  '{vbTab}
            Dim currentRow As String()
            'Loop through all of the fields in the file.  
            'If any lines are corrupt, report an error and continue parsing.  
            Dim OrderRequest As New cCSVOrderRequest
            OrderRequest.Items = New List(Of cCSVProductItem)

            Dim Product As ProductClass = Nothing
            Dim Item As cCSVProductItem = Nothing
            
            '' Read the header row, first line in the file, this is done once per file
            currentRow = MyReader.ReadFields()             
            
            While Not MyReader.EndOfData
                Try

                    ' Include code here to handle the row. 
                    Dim fields As String() = MyReader.ReadFields()
                    Item = New cCSVProductItem()
                    Item.OrderItemNumber = fields(0)
                    Item.PartNumber = fields(2)
                    Item.Description = fields(3)
                    Item.Quantity = fields(4)
                    Item.ShipTitle = fields(17)
                    Item.ShipToName = fields(18)
                    Item.ShipAddress1 = fields(19)
                    Item.ShipAddress2 = fields(20)
                    Item.ShipAddress3 = fields(21)
                    Item.ShipAddress4 = fields(22)
                    If fields(23).Contains("GB") Then
                        Item.ShipCountry = "238"
                    Else
                        Item.ShipCountry = ""
                        'CommonFunctions.SendErrorEmail("")
                    End If
                    Item.ShipPostCode = fields(24)
                    Item.PhoneNumber = fields(28)
                    OrderRequest.Items.Add(Item)
                Catch ex As Microsoft.VisualBasic.FileIO.MalformedLineException
                    'CommonFunctions.SendErrorEmail("")
                    Return False
                End Try
            End While
            aCSV.OrderRequest = OrderRequest
        End Using
    Next
    Return True
End Function

Open in new window

0
 

Author Closing Comment

by:mehmast
ID: 40442607
thank you
0
 
LVL 63

Expert Comment

by:Fernando Soto
ID: 40442619
Not a problem mehmast, glad to help.
0

Featured Post

Independent Software Vendors: We Want Your Opinion

We value your feedback.

Take our survey and automatically be enter to win anyone of the following:
Yeti Cooler, Amazon eGift Card, and Movie eGift Card!

Question has a verified solution.

If you are experiencing a similar issue, please ask a related question

Suggested Solutions

Title # Comments Views Activity
VB.net -  GroupBox / Panel DataBinding and behavior 3 24
how to remove error in database 6 38
"lblTime is not declared" 3 38
Copying from a network share 3 26
More often than not, we developers are confronted with a need: a need to make some kind of magic happen via code. Whether it is for a client, for the boss, or for our own personal projects, the need must be satisfied. Most of the time, the Framework…
Today I had a very interesting conundrum that had to get solved quickly. Needless to say, it wasn't resolved quickly because when we needed it we were very rushed, but as soon as the conference call was over and I took a step back I saw the correct …
Nobody understands Phishing better than an anti-spam company. That’s why we are providing Phishing Awareness Training to our customers. According to a report by Verizon, only 3% of targeted users report malicious emails to management. With compan…

697 members asked questions and received personalized solutions in the past 7 days.

Join the community of 500,000 technology professionals and ask your questions.

Join & Ask a Question