
Signature
Cato Larsen
HelpDesk Monkey
> I've never parsed text in Word before, so the whole approach is new to me,
> and google was for once not that helpfull in my search for parsing txt files
> in word.
Last thing first. You're parsing text files in VB(A), not Word! That's the first
mindset that needs to change. This isn't a job for Word.
> The formatting of the text file is as follows:
How big are these files? Presumably, very small, right? A few hundred K, at most?
I would advise reading the entire file into an array of "lines" and parsing them one
by one. That's pretty easy to do, sorta like this:
Dim TheLines() As String
TheLines = Split$(ReadFile(MyFile$), vbCrLf)
Public Function ReadFile(ByVal FileName As String) As String
Dim hFile As Long
On Error GoTo Hell
hFile = FreeFile
Open FileName For Binary As #hFile
ReadFile = Space$(LOF(hFile))
Get #hFile, , ReadFile
Close #hFile
Hell:
End Function
Then, you start looping through the file, line by line.
> At the top there are about 4-5 lines of junk. This can be discarded.
Is there a "comment" like marker for these? Something to identify them as junk? If
not, you'll need to decide whether it's 4 or 5. That matters. At any rate, in your
loop through TheLines(), you simply skip processing these. (I'd probably advise
also adding a test here to be sure the line isn't empty, and skip those too?)
I would suggest you create a series of flags that keep track of what section you're
in, if the sections always follow the same pattern. For instance:
Const secJunk = 0
Const secNames = 1
Const secInterfaces = 2
'etc
Private m_Section As Long
> Next up are some 30 lines (has to be counted dynamicly) with the following
> formatting:
[quoted text clipped - 4 lines]
>
> name is static to all these lines.
Dim ThisLine As Variant
If m_Section <= secNames Then
If InStr(1, TheLines(i), "name", vbTextCompare) = 1 Then
' Set section flag to Names section!
m_Section = secNames
' Parse this line.
ThisLine = Split(Trim$(TheLines(i)), " ")
ipAddress = ThisLine(1)
hostAddress = ThisLine(2)
' Do something with this data?
End If
End IF
> Next up is interfaces, and they are separated by an exclamation mark before
> each "box" of text.
[quoted text clipped - 12 lines]
> interface, nameif, security-level & ip address are static to this bulk of
> text.
Same pattern as last section.
If m_Section <= secInterfaces Then
If InStr(1, TheLines(i), "interface", vbTextCompare) = 1 Then
' Set section flag to Names section!
m_Section = secInterfaces
' Parse this line.
ThisLine = Split(Trim$(TheLines(i)), " ")
interfaceName = ThisLine(1)
' Parse next line.
ThisLine = Split(Trim$(TheLines(i + 1)), " ")
nameif = ThisLine(1)
' Parse next line.
ThisLine = Split(Trim$(TheLines(i + 2)), " ")
security-level = ThisLine(1)
' Parse next line.
ThisLine = Split(Trim$(TheLines(i + 3)), " ")
ipAddress = ThisLine(2)
hostMask = ThisLine(3)
' Do something with this data?
End If
End IF
You'll have to insure your naming scheme is logically consistent with the above
assumptions, of course.
> Next are some object groups
> Formatting;
[quoted text clipped - 11 lines]
> One object-group can contain an unknown amount of objects and other types of
> service descriptors.
Same pattern as before. <g>
> My biggest issue is how to get this info into tables with a formatting &
> having it dynamicly update if the data.txt file is changed.
Now(!), you're talking about using Word. Up until now, it's all been VB(A). I
don't know diddly about Word, so perhaps someone else can lend a hand here.
Have fun...

Signature
.NET: It's About Trust!
http://vfred.mvps.org
Cato Larsen - 13 Feb 2008 07:10 GMT
Excellent reply Karl. Thanks a lot for the insight on how to best solve this
with with VB in Word. :)
Can anyone help out regarding the word part of this issue? How to insert the
data gathered into tables?

Signature
Cato Larsen
HelpDesk Monkey
Doug Robbins - Word MVP - 13 Feb 2008 11:46 GMT
You will need to declare a document object, a table object and a row object
Dim ddoc as Document
Dim dtable as Table
Dim drow as Row
then at the beginning create a new document with a one row table in it
Set ddoc = Documents.Add
set dtable = ddoc.Tables.Add(ddoc.Range, 1, n)
where n is the required number of columns,
Then, at the point where you have accumulated the data for one record, use
Set drow = dtables.Rows.Add
then for each piece of data use
drow.cells(i).Range.Text = the data
and increment i for each piece of data
Then repeat the adding of rows and populating of the cells in that row for
each record.

Signature
Hope this helps.
Please reply to the newsgroup unless you wish to avail yourself of my
services on a paid consulting basis.
Doug Robbins - Word MVP
> Excellent reply Karl. Thanks a lot for the insight on how to best solve
> this
[quoted text clipped - 3 lines]
> the
> data gathered into tables?
Cato Larsen - 13 Feb 2008 12:44 GMT
Excellent!
Thank you for the in-depth explanation. Will help me out a lot!
Time to get down and dirty and start working on this bugger.
Thank you all who contributed to this thread!

Signature
Cato Larsen
HelpDesk Monkey