Solved

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

Posted on 2004-09-02
7
178 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
Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

 
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

Is Your Active Directory as Secure as You Think?

More than 75% of all records are compromised because of the loss or theft of a privileged credential. Experts have been exploring Active Directory infrastructure to identify key threats and establish best practices for keeping data safe. Attend this month’s webinar to learn more.

Question has a verified solution.

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

Introduction While answering a recent question (http://www.experts-exchange.com/Q_27402310.html) in the VB classic zone, I wrote some VB code in the (Office) VBA environment, rather than fire up my older PC.  I didn't post completely correct code o…
Enums (shorthand for ‘enumerations’) are not often used by programmers but they can be quite valuable when they are.  What are they? An Enum is just a type of variable like a string or an Integer, but in this case one that you create that contains…
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…
Show developers how to use a criteria form to limit the data that appears on an Access report. It is a common requirement that users can specify the criteria for a report at runtime. The easiest way to accomplish this is using a criteria form that a…

895 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

16 Experts available now in Live!

Get 1:1 Help Now