liezl
asked on
Textstream
Hi!...i have a vb program that writes and reads from a textfile...i'm using the textstream class.i want to read the file line by line...how do i do it without using the 'open...for input' and the AtEndOfLine property?is there any other way to do this?i want to use a timer that reads each line every 5 seconds so i dont think do until AtEndOfLine will be helpful for me...
Please help...i would really appreciate it!!!!
Please help...i would really appreciate it!!!!
Hi liezl!
Have a look at this:
Create a form, put a timer on it and create a reference to the scripting runtime.
At the beginning of the form-code...
Private m_fsoFileSystem As FileSystemObject
Private m_tsInput As Textstream
Private m_strCurrentLine As String
Private Sub Form_Load()
Set m_fsoFileSystem = New FileSystemObject
Set m_tsInput = m_fsoFileSystem.OpenTextFi le(<yourfi lename>)
Me.Timer.Enabled=True
End Sub
Private Sub Timer_Timer()
If Not m_tsInput.AtEndOfStream
m_strCurrentLine = m_tsInput.ReadLine
Else
Timer.Enabled=False
MsgBox "End of file reached!"
End If
End Sub
Hope that helps!!
Kristof
Have a look at this:
Create a form, put a timer on it and create a reference to the scripting runtime.
At the beginning of the form-code...
Private m_fsoFileSystem As FileSystemObject
Private m_tsInput As Textstream
Private m_strCurrentLine As String
Private Sub Form_Load()
Set m_fsoFileSystem = New FileSystemObject
Set m_tsInput = m_fsoFileSystem.OpenTextFi
Me.Timer.Enabled=True
End Sub
Private Sub Timer_Timer()
If Not m_tsInput.AtEndOfStream
m_strCurrentLine = m_tsInput.ReadLine
Else
Timer.Enabled=False
MsgBox "End of file reached!"
End If
End Sub
Hope that helps!!
Kristof
ASKER
hi kberger!
thanx for your code...one more thing...is it possible to access one textfile for reading and writing at the same time?that's what i've been trying to do.i did two separate programs that access the same file at the same time and it wont work...thanx! :)
thanx for your code...one more thing...is it possible to access one textfile for reading and writing at the same time?that's what i've been trying to do.i did two separate programs that access the same file at the same time and it wont work...thanx! :)
Well its "kinda" possible...
You can access the file forReading anf forAppending...
ForAppending allows to add more lines to a textfile while forreading will just read. If you try to use forWriting then the file will be overwritten and you cant open it for reading anymore...
(does this make sense???)
Hope this helps
You can access the file forReading anf forAppending...
ForAppending allows to add more lines to a textfile while forreading will just read. If you try to use forWriting then the file will be overwritten and you cant open it for reading anymore...
(does this make sense???)
Hope this helps
ASKER
hi kristof...the previous code u gave me reads the same line which is the first line.it wont go to the next line.
Hi liezl,
I make it short this time:
Set ws = CreateObject("WScript.Shel l")
Set fso = CreateObject("Scripting.Fi leSystemOb ject")
TmpFile = fso.GetSpecialFolder(2) & "file.txt"
Set f = fso.GetFile(TmpFile)
Set ts = f.OpenAsTextStream
theStrg = ts.readall
...
At this point you have the whole textstream in the "theStrg" variable. You can now perform any action with all of the text.
Tabs [chr(13)] or line breaks [chr(10)] can be seperated with the "split" command.
You can check before how many line breaks there are with running a counter like:
Dim i as long, j as long
For i = 1 to len(theStrg)
If mid(theStrg, 1, i) = chr(10) Then j = j + 1
Next
"i" holds the number of lines you're having.
Now you can strip each line:
Dim theSplitter as Variant
theSplitter = Split(theStrg, chr(10))
For i = 1 to j
...do what ever with... theSplitter(i)
Next
You can even split up each line if there are any fields in a line ...
Hope this time its easier to understand!
Best regards, Raisor
I make it short this time:
Set ws = CreateObject("WScript.Shel
Set fso = CreateObject("Scripting.Fi
TmpFile = fso.GetSpecialFolder(2) & "file.txt"
Set f = fso.GetFile(TmpFile)
Set ts = f.OpenAsTextStream
theStrg = ts.readall
...
At this point you have the whole textstream in the "theStrg" variable. You can now perform any action with all of the text.
Tabs [chr(13)] or line breaks [chr(10)] can be seperated with the "split" command.
You can check before how many line breaks there are with running a counter like:
Dim i as long, j as long
For i = 1 to len(theStrg)
If mid(theStrg, 1, i) = chr(10) Then j = j + 1
Next
"i" holds the number of lines you're having.
Now you can strip each line:
Dim theSplitter as Variant
theSplitter = Split(theStrg, chr(10))
For i = 1 to j
...do what ever with... theSplitter(i)
Next
You can even split up each line if there are any fields in a line ...
Hope this time its easier to understand!
Best regards, Raisor
ASKER CERTIFIED SOLUTION
membership
This solution is only available to members.
To access this solution, you must be a member of Experts Exchange.
ASKER
thanks!the program is already working!
Here's a rather complex example for your problem ... I developed it to retrieve the client IP address provided by an ISP from a system text file ... this covers multiple windows versions and multiple languages.
Within the lines you'll see how I use the "textstream":
Public Sub GetClientIP()
Dim ws, fso, TmpFile, ThisLine, IP, ts, f, theStrg, theStrg2, theSplitter, theSplitter2, theSplitter3, i As Long, j As Long
Dim a(theNetworkIndex) As Long
FindLanguage
numOfAdaps = 0
Set ws = CreateObject("WScript.Shel
Set fso = CreateObject("Scripting.Fi
TmpFile = fso.GetSpecialFolder(2) & "/ip.txt"
If ws.Environment("SYSTEM")("
SupportedOS = False
ws.run "winipcfg /all /batch " & TmpFile, 0, True
Else
SupportedOS = True
ws.run "%comspec% /c ipconfig /all >" & TmpFile, 0, True
End If
DoEvents
Set f = fso.GetFile(TmpFile)
Set ts = f.OpenAsTextStream
theStrg = ts.readall
Select Case LanguageInfo.theLanguageID
Case 3081, 4105, 2057, 1033
theSplitter = Split(Trim(theStrg), "Host Name")
'If ws.Environment("SYSTEM")("
' theSplitter2 = Split(Trim(theSplitter(1))
'Else
theSplitter2 = Split(Trim(theSplitter(1))
'End If
theSplitter3 = Split(Trim(theSplitter2(0)
theStrg2 = Split(Trim(theSplitter3(1)
theHostName = theStrg2(0)
For i = 1 To Len(theStrg) - Len("Description")
If Mid(theStrg, i, Len("Description")) = "Description" Then
numOfAdaps = numOfAdaps + 1
a(numOfAdaps - 1) = i + Len("Description")
End If
Next
theSplitter = Split(theStrg, "Description")
For i = 0 To numOfAdaps - 1
' If ws.Environment("SYSTEM")("
' theSplitter2 = Split(Trim(theSplitter(i + 1)), "Physische")
' Else
theSplitter2 = Split(Trim(theSplitter(i + 1)), "Physical")
' End If
theSplitter3 = Split(Trim(theSplitter2(0)
theStrg2 = Split(Trim(theSplitter3(1)
myNetworkInfo(i).theDescri
Next
'If ws.Environment("SYSTEM")("
' theSplitter = Split(theStrg, "Physische Adresse")
'Else
theSplitter = Split(theStrg, "Physical Address")
'End If
For i = 0 To numOfAdaps - 1
theSplitter2 = Split(Trim(theSplitter(i + 1)), "DHCP Enabled")
theSplitter3 = Split(Trim(theSplitter2(0)
theStrg2 = Split(Trim(theSplitter3(1)
myNetworkInfo(i).thePhysic
Next
theSplitter = Split(theStrg, "IP Address")
For i = 0 To numOfAdaps - 1
' If ws.Environment("SYSTEM")("
' theSplitter2 = Split(Trim(theSplitter(i + 1)), "Subnet Mask")
' Else
theSplitter2 = Split(Trim(theSplitter(i + 1)), "Subnet Mask")
' End If
theSplitter3 = Split(Trim(theSplitter2(0)
theStrg2 = Split(Trim(theSplitter3(1)
myNetworkInfo(i).theIPAddr
Next
Case 1031, 3079, 2055
theSplitter = Split(Trim(theStrg), "Hostname")
If ws.Environment("SYSTEM")("
theSplitter2 = Split(Trim(theSplitter(1))
Else
theSplitter2 = Split(Trim(theSplitter(1))
End If
theSplitter3 = Split(Trim(theSplitter2(0)
theStrg2 = Split(Trim(theSplitter3(1)
theHostName = theStrg2(0)
For i = 1 To Len(theStrg) - Len("Beschreibung")
If Mid(theStrg, i, Len("Beschreibung")) = "Beschreibung" Then
numOfAdaps = numOfAdaps + 1
a(numOfAdaps - 1) = i + Len("Beschreibung")
End If
Next
theSplitter = Split(theStrg, "Beschreibung")
For i = 0 To numOfAdaps - 1
If ws.Environment("SYSTEM")("
theSplitter2 = Split(Trim(theSplitter(i + 1)), "Physische")
Else
theSplitter2 = Split(Trim(theSplitter(i + 1)), "Physikalische")
End If
theSplitter3 = Split(Trim(theSplitter2(0)
theStrg2 = Split(Trim(theSplitter3(1)
myNetworkInfo(i).theDescri
Next
If ws.Environment("SYSTEM")("
theSplitter = Split(theStrg, "Physische Adresse")
Else
theSplitter = Split(theStrg, "Physikalische Adresse")
End If
For i = 0 To numOfAdaps - 1
theSplitter2 = Split(Trim(theSplitter(i + 1)), "DHCP aktiviert")
theSplitter3 = Split(Trim(theSplitter2(0)
theStrg2 = Split(Trim(theSplitter3(1)
myNetworkInfo(i).thePhysic
Next
theSplitter = Split(theStrg, "IP-Adresse")
For i = 0 To numOfAdaps - 1
If ws.Environment("SYSTEM")("
theSplitter2 = Split(Trim(theSplitter(i + 1)), "Subnet Mask")
Else
theSplitter2 = Split(Trim(theSplitter(i + 1)), "Subnetzmaske")
End If
theSplitter3 = Split(Trim(theSplitter2(0)
theStrg2 = Split(Trim(theSplitter3(1)
myNetworkInfo(i).theIPAddr
Next
Case Else
End Select
ts.Close
fso.GetFile(TmpFile).Delet
Set ts = Nothing
Set fso = Nothing
Set ws = Nothing
End Sub
Best regards, Raisor