Need help with VB.NET solution - transitioning from access vba to vb.net.

I'm reading a csv file with File System Object and have to determine out of each column what's the greatest length of a strings value!  So obviously I would need to go through the entire text file and store each row into memory - then cycle through.   I do have the code to read the csv file using the file system object already - what I do not know how to do is to take the information and put it into an arraylist per each column?   1st column is qty, 2nd is description and 3rd is manufacturer.

What makes it confusing is as I do research it would seem I need to create a class preferably?  

Why the access vba to vb.net statement above?
 I used to do this in access vba by taking each and row and putting it into a table - then running a sql statement that sorted on the Len(column) in descending order.  And the DAO recordset was easy to do to pull info - but I'm still learning vb.net and object oriented programming.

objStream = FSO.OpenTextFile(sFileName, 1, False, 0)
        Do While Not objStream.AtEndOfStream
            strLine = objStream.ReadLine
        Loop
        objStream.Close()
        objStream = Nothing

Any help is much appreciated.
LVL 1
stephenlecomptejrAsked:
Who is Participating?

[Product update] Infrastructure Analysis Tool is now available with Business Accounts.Learn More

x
I wear a lot of hats...

"The solutions and answers provided on Experts Exchange have been extremely helpful to me over the last few years. I wear a lot of hats - Developer, Database Administrator, Help Desk, etc., so I know a lot of things but not a lot about one thing. Experts Exchange gives me answers from people who do know a lot about one thing, in a easy to use platform." -Todd S.

nepaluzCommented:
Using a textfieldparser with a check for the length of each line would solve the issue
Dim xTable As New DataTable
With xTable
    .Columns.Add(New DataColumn With {.ColumnName = "Qty"})
    .Columns.Add(New DataColumn With {.ColumnName = "Des"})
    .Columns.Add(New DataColumn With {.ColumnName = "Man"})
End With
Using xReader As New FileIO.TextFieldParser("PathToFile") With {.Delimiters = {","}}
    While Not xReader.EndOfData
        Dim Line = xReader.ReadFields()
        If Line.Count < 3 OrElse String.IsNullOrEmpty(Line(0).ToString) Then Continue While
        Dim xRow As DataRow = xTable.NewRow()
        xRow.ItemArray = Line.ToArray
        xTable.Rows.Add(xRow)
    End While
End Using

Open in new window

I have also taken the liberty toplace the contents in a datatable!
0

Experts Exchange Solution brought to you by

Your issues matter to us.

Facing a tech roadblock? Get the help and guidance you need from experienced professionals who care. Ask your question anytime, anywhere, with no hassle.

Start your 7-day free trial
stephenlecomptejrAuthor Commented:
Would there be a limit to rows putting it in a datatable?
The code above no where uses the textfieldparser as you suggest right?
0
nepaluzCommented:
The code DEFINITELY uses the TextFieldParser, parsing the file line by line delimited by a comma  (,). If you wish to change the delimter, you can do this in the initialisation statement (on line 7 in the code above).
With regard to a limit to the rows, the code will read all lines in the file and if a line contains more that two fields, then it will add the contents to a datarow and then to the table. I do not have the file structure of the you are trying to read, but with hindsight I would change line 12 above from:
xRow.ItemArray = Line.ToArray

Open in new window

to
xRow.ItemArray = {Line(0).ToString, Line(1).ToString, Line(2).ToString}

Open in new window

to handle the situation where the line contains more than three fields.
0
10 Tips to Protect Your Business from Ransomware

Did you know that ransomware is the most widespread, destructive malware in the world today? It accounts for 39% of all security breaches, with ransomware gangsters projected to make $11.5B in profits from online extortion by 2019.

stephenlecomptejrAuthor Commented:
I actually had 5 columns and was able to do it with this code:

<code>
Dim xTable As New DataTable
        With xTable
            .Columns.Add(New DataColumn With {.ColumnName = "Qty"})
            .Columns.Add(New DataColumn With {.ColumnName = "Des"})
            .Columns.Add(New DataColumn With {.ColumnName = "Des1"})
            .Columns.Add(New DataColumn With {.ColumnName = "Des2"})
            .Columns.Add(New DataColumn With {.ColumnName = "Des3"})
        End With
        Using xReader As New FileIO.TextFieldParser(sFileName) With {.Delimiters = {","}}
            While Not xReader.EndOfData
                Dim Line = xReader.ReadFields()
                If Line.Count < 3 OrElse String.IsNullOrEmpty(Line(0).ToString) Then Continue While
                Dim xRow As DataRow = xTable.NewRow()
                xRow.ItemArray = Line.ToArray
                xTable.Rows.Add(xRow)
            End While
        End Using


        'then rewrite the code below
        'to reiterate through the data table
        'and save as a new file.

        For Each row As DataRow In xTable.Rows
            strNewLine = row.Item("Qty") & vbTab & row.Item("Des") & vbTab & row.Item("Des1") & vbTab & row.Item("Des2") & vbTab & row.Item("Des3")
            FSONew = CreateObject("Scripting.FileSystemObject")
            objStreamNew = FSO.OpenTextFile(sFileNameAdj, 8, False, 0)
            'need to change strNewLine to grab each column of data table.
            objStreamNew.WriteLine(strNewLine)
            objStreamNew.Close()
            objStreamNew = Nothing
            FSONew = Nothing

        Next row
</code>


I have 3 questions:

1.
The only piece of code I don't understand is this...

If Line.Count < 3 OrElse String.IsNullOrEmpty(Line(0).ToString) Then Continue While

Why would you continue if line.count < 3?

2.
Do I also need to change my above code to do as you have xRow.ItemArray = {Line(0).ToString, Line(1).ToString, Line(2).ToString}?  Because it works well as it is?

3. How do I get code to actually show up as code?  I thought adding <code> as I have it above would work?
0
nepaluzCommented:
1. I put thatthere because you had 3 fields of data initially, so ifthey were less then trying to assign them to the datarow would cause an error
2. You do not need to change it since I incorporated the test for line fields.
3. To get the code formating, add with using the [ ] not < > i.e square brackets not angled ones
0
stephenlecomptejrAuthor Commented:
Thank you for help.  Please help me in the future - I'm sure to have plenty more!
0
It's more than this solution.Get answers and train to solve all your tech problems - anytime, anywhere.Try it for free Edge Out The Competitionfor your dream job with proven skills and certifications.Get started today Stand Outas the employee with proven skills.Start learning today for free Move Your Career Forwardwith certification training in the latest technologies.Start your trial today
Visual Basic.NET

From novice to tech pro — start learning today.