Solved

Read muli field, multi line text file into 2D string array

Posted on 2004-09-02
7
175 Views
Last Modified: 2010-05-02
I have a text file that looks like this....

'314' 'TM15025.PV' 'ON' 'N/A' 'N/A' 'N/A'
'312' 'TM15025.PV' 'ON' 'N/A' 'N/A' 'N/A'
'315' 'TM16027.PV' 'ON' 'N/A' 'N/A' 'N/A'
'316' 'TM16028.PV' 'ON' 'N/A' 'N/A' 'N/A'

I want to have a 2D array that has all this info.

For example.

strArray(0,0) would equal '314'
strArray(0,1) would equal 'TM15025.PV'

I was thinking

----
Dim i as Integer
Do While EOF(1)
    Redim Preserve strArray(i, 6)
    <Some how read the line into the array>
    i = i + 1
Loop
0
Comment
Question by:gillgates
7 Comments
 
LVL 4

Expert Comment

by:MrClean21
ID: 11967253
Hi gillgates,

Take a look at this script :

http://www.vb-helper.com/howto_csv_to_array.html

MrClean
0
 
LVL 22

Expert Comment

by:DarkoLord
ID: 11967306
Dim i as Long, j as Long
Dim tmpArr() As String

 Do While Not EOF(f)
    Redim Preserve strArray(i, 6)        
    Line Input #1, strTmp
    tmpArr = Split(strTmp, " ")
    for j = LBount(tmpArr) to Ubound(tmpArr)
       strArray(i, j) = Replace$(tmpArr(j), "'")
    next j    
    i = i + 1
 Loop
0
 
LVL 85

Expert Comment

by:Mike Tomlinson
ID: 11969130
The field data is denoted by a beginning single quote ' and an ending single quote '.

If there are NEVER any spaces in the field data, then go with what DarkoLord has given you, otherwise you will have to loop through each input line using Instr() to find the single quotes and extract the data inbetween.

Regards,

Idle_Mind
0
6 Surprising Benefits of Threat Intelligence

All sorts of threat intelligence is available on the web. Intelligence you can learn from, and use to anticipate and prepare for future attacks.

 
LVL 3

Author Comment

by:gillgates
ID: 11969292
I actually figured it out on my own, well almost.  I am not at work anymore so tomorrow morning I will post my code and you can see what I still need...

I can tell you this...

I do a Redim Preserve strData(i, 6) and I get an error, can't remember which one...
I do know that it happens after i goes from 1 to 2
0
 
LVL 3

Author Comment

by:gillgates
ID: 11974455
When I run this I get "Run-time error 9, Subscript out of range"

This happens when it loops around the second time and i = 2
It happens on this line --> ReDim Preserve strInputs(i, 6)

Ok, here is my code...

strInputs() is a global variable

Public Sub ReadFile()
    Dim strData As String
    Dim i As Integer
    Dim y As Integer
    Dim q As Integer
    Dim s As Boolean
   
    s = False
   
    i = 1
    Open app.Path & "\\pisap.tgl" For Input As #1
    Do Until EOF(1)
        ReDim Preserve strInputs(i, 6)
        Line Input #1, strData
        q = 1
        For y = 1 To Len(strData)
            If Mid(strData, y, 1) <> "'" Then
                If Mid(strData, y, 1) <> " " Then
                    strInputs(i, q) = strInputs(i, q) + Mid(strData, y, 1)
                    s = False
                Else
                    If s = False Then
                        q = q + 1
                        s = True
                    End If
                End If
            End If
        Next
        i = i + 1
    Loop
End Sub
0
 
LVL 3

Author Comment

by:gillgates
ID: 11974615
I also tried making it so strInputs wasn't a global variable and it didn't help...

Public Sub ReadFile(ByRef strInputs() As String)
    Dim strData As String
    Dim i As Integer
    Dim y As Integer
    Dim q As Integer
    Dim s As Boolean
   
    s = False
   
    i = 1
    Open app.Path & "\\pisap.tgl" For Input As #1
    Do Until EOF(1)
        ReDim Preserve strInputs(i, 6)
        Line Input #1, strData
        q = 1
        For y = 1 To Len(strData)
            If Mid(strData, y, 1) <> "'" Then
                If Mid(strData, y, 1) <> " " Then
                    strInputs(i, q) = strInputs(i, q) + Mid(strData, y, 1)
                    s = False
                Else
                    If s = False Then
                        q = q + 1
                        s = True
                    End If
                End If
            End If
        Next
        i = i + 1
    Loop
End Sub
0
 
LVL 85

Accepted Solution

by:
Mike Tomlinson earned 250 total points
ID: 11975006
When you redim a multidimensional array with the Preserve keyword, you can only change the size of the last dimension.  So you have to swap your dimensions for it to work like this:

Option Base 1
Option Explicit

Private strInputs() As String

Private Sub Command1_Click()
    Dim recNo As Integer
    Dim fieldNum As Integer
    Dim record As String
   
    ReadFile "c:\someFile.txt"

    For recNo = 1 To UBound(strInputs, 2)
        record = "RecNo " & recNo & ":"
        For fieldNum = 1 To 6
            record = record & " " & strInputs(fieldNum, recNo)
        Next fieldNum
        Debug.Print record
    Next recNo
End Sub

Public Sub ReadFile(ByVal fileName As String)
    If Dir(fileName) = "" Then
        MsgBox fileName, vbCritical, "File not found"
        Exit Sub
    End If
       
    Dim inputLine As String
    Dim firstQuote As Integer
    Dim secondQuote As Integer
    Dim fieldData As String
    Dim fieldNumber As Integer
    Dim lineNumber As Integer
           
    lineNumber = 1
    Open fileName For Input As #1
    Do Until EOF(1)
        ReDim Preserve strInputs(6, lineNumber)
        Line Input #1, inputLine
        firstQuote = 0
        For fieldNumber = 1 To 6
            firstQuote = InStr(firstQuote + 1, inputLine, "'")
            If firstQuote > 0 Then
                secondQuote = InStr(firstQuote + 1, inputLine, "'")
                If secondQuote > 0 Then
                    fieldData = Mid(inputLine, firstQuote + 1, secondQuote - (firstQuote + 1))
                    strInputs(fieldNumber, lineNumber) = fieldData
                    firstQuote = secondQuote + 1
                Else
                    MsgBox inputLine, vbCritical, "Missing Matching Quote"
                End If
            Else
                MsgBox inputLine, vbCritical, "Invalid Input Line"
                Close #1
                Exit Sub
            End If
        Next fieldNumber
        lineNumber = lineNumber + 1
    Loop
    Close #1
End Sub

Regards,

{pseudocode} / {Time} ± ¼*ƒ(Me.Thoughts÷3)^² = Idle »(°_°)« Mind
0

Featured Post

Free Trending Threat Insights Every Day

Enhance your security with threat intelligence from the web. Get trending threat insights on hackers, exploits, and suspicious IP addresses delivered to your inbox with our free Cyber Daily.

Join & Write a Comment

Suggested Solutions

I’ve seen a number of people looking for examples of how to access web services from VB6.  I’ve been using a test harness I built in VB6 (using many resources I found online) that I use for small projects to work out how to communicate with web serv…
I was working on a PowerPoint add-in the other day and a client asked me "can you implement a feature which processes a chart when it's pasted into a slide from another deck?". It got me wondering how to hook into built-in ribbon events in Office.
Get people started with the process of using Access VBA to control Outlook using automation, Microsoft Access can control other applications. An example is the ability to programmatically talk to Microsoft Outlook. Using automation, an Access applic…
Get people started with the utilization of class modules. Class modules can be a powerful tool in Microsoft Access. They allow you to create self-contained objects that encapsulate functionality. They can easily hide the complexity of a process from…

762 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

24 Experts available now in Live!

Get 1:1 Help Now