Solved

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

Posted on 2012-04-12
6
324 Views
Last Modified: 2012-08-13
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.
0
Comment
Question by:stephenlecomptejr
  • 3
  • 3
6 Comments
 
LVL 17

Accepted Solution

by:
nepaluz earned 500 total points
ID: 37840366
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
 
LVL 1

Author Comment

by:stephenlecomptejr
ID: 37840891
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
 
LVL 17

Expert Comment

by:nepaluz
ID: 37841693
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
Highfive + Dolby Voice = No More Audio Complaints!

Poor audio quality is one of the top reasons people don’t use video conferencing. Get the crispest, clearest audio powered by Dolby Voice in every meeting. Highfive and Dolby Voice deliver the best video conferencing and audio experience for every meeting and every room.

 
LVL 1

Author Comment

by:stephenlecomptejr
ID: 37853250
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
 
LVL 17

Expert Comment

by:nepaluz
ID: 37853301
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
 
LVL 1

Author Closing Comment

by:stephenlecomptejr
ID: 37853356
Thank you for help.  Please help me in the future - I'm sure to have plenty more!
0

Featured Post

How your wiki can always stay up-to-date

Quip doubles as a “living” wiki and a project management tool that evolves with your organization. As you finish projects in Quip, the work remains, easily accessible to all team members, new and old.
- Increase transparency
- Onboard new hires faster
- Access from mobile/offline

Join & Write a Comment

Microsoft SharePoint Foundation 2010 and Microsoft SharePoint Server 2010 do not offer the option to configure the location of the SharePoint diagnostic trace log files during installation.  This can, however, be configured through Central Administr…
It was really hard time for me to get the understanding of Delegates in C#. I went through many websites and articles but I found them very clumsy. After going through those sites, I noted down the points in a easy way so here I am sharing that unde…
Here's a very brief overview of the methods PRTG Network Monitor (https://www.paessler.com/prtg) offers for monitoring bandwidth, to help you decide which methods you´d like to investigate in more detail.  The methods are covered in more detail in o…
This demo shows you how to set up the containerized NetScaler CPX with NetScaler Management and Analytics System in a non-routable Mesos/Marathon environment for use with Micro-Services applications.

758 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

Need Help in Real-Time?

Connect with top rated Experts

19 Experts available now in Live!

Get 1:1 Help Now