Home |
Search |
Today's Posts |
|
#1
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Guys,
I'd like to open and parse a file such that when I parse, only lines with certain text in them get included into my array. How can I accomplish this? For example, let say that file contents are as follows: text in line 1 text in line 2 layer_1 layer_2 layer_3 I'd like to save the lines with layer_1, layer_2, and layer_3 in my array named line. Here's what I have so far - what should I do next? Sub geomsasciiparse() Dim Buf() As String Dim logical_layer As Variant Dim line() As String Dim objFSO As Object Dim objGeomsAsciiFile As Object Set objFSO = CreateObject("Scripting.FileSystemObject") Set objGeomsAsciiFile = objFSO.OpenTextFile(MentDesContPath & "\geoms_ascii") strBuffer = objGeomsAsciiFile.Readline Do While Not objGeomsAsciiFile.AtEndOfStream If InStr(strBuffer, "layer") = 1 Then End If Thanks for help. |
#2
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Function OpenTextFileToString(strFile As String) As String
Dim hFile As Long On Error GoTo ERROROUT hFile = FreeFile Open strFile For Binary As #hFile OpenTextFileToString = Space(LOF(hFile)) Get hFile, , OpenTextFileToString Close #hFile Exit Function ERROROUT: If hFile 0 Then Close #hFile End If End Function Sub Test() Dim i As Long Dim n As Long Dim str As String Dim arr1 Dim arr2() As String str = OpenTextFileToString("C:\testfile.txt") arr1 = Split(str, vbCrLf) ReDim arr2(0 To UBound(arr1)) As String For i = 0 To UBound(arr1) If InStr(1, arr1(i), "layer_", vbBinaryCompare) 0 Then arr2(n) = arr1(i) n = n + 1 End If Next i ReDim Preserve arr2(0 To n - 1) As String 'to check we got it right For i = 0 To UBound(arr2) MsgBox arr2(i), , i Next i End Sub RBS "Varun" wrote in message ... Guys, I'd like to open and parse a file such that when I parse, only lines with certain text in them get included into my array. How can I accomplish this? For example, let say that file contents are as follows: text in line 1 text in line 2 layer_1 layer_2 layer_3 I'd like to save the lines with layer_1, layer_2, and layer_3 in my array named line. Here's what I have so far - what should I do next? Sub geomsasciiparse() Dim Buf() As String Dim logical_layer As Variant Dim line() As String Dim objFSO As Object Dim objGeomsAsciiFile As Object Set objFSO = CreateObject("Scripting.FileSystemObject") Set objGeomsAsciiFile = objFSO.OpenTextFile(MentDesContPath & "\geoms_ascii") strBuffer = objGeomsAsciiFile.Readline Do While Not objGeomsAsciiFile.AtEndOfStream If InStr(strBuffer, "layer") = 1 Then End If Thanks for help. |
#3
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
The following code will output all the lines containing the text "layers_"
**anywhere** within them. Notice that you can't pick and choose a subset of all the "layer_" lines; that is, you can't use this method to only output "layer_1" and "layer_2" skipping over "layer_3"... the search text that gets used in the Filter function works like that in the InStr function. Oh, and change the file names for the input and output files. Sub ReadProcessOutput() Dim FileNum As Long Dim TotalFile As String Dim LinesOut As String Dim LinesIn() As String FileNum = FreeFile Open "d:\temp\Test.txt" For Binary As #FileNum TotalFile = Space(LOF(FileNum)) Get #FileNum, , TotalFile Close #FileNum LinesIn = Split(TotalFile, vbCrLf) LinesOut = Join(Filter(LinesIn, "layer_", True, vbTextCompare), vbCrLf) FileNum = FreeFile Open "d:\temp\OutTest.txt" For Output As #FileNum Print #FileNum, LinesOut Close #FileNum End Sub -- Rick (MVP - Excel) "RB Smissaert" wrote in message ... Function OpenTextFileToString(strFile As String) As String Dim hFile As Long On Error GoTo ERROROUT hFile = FreeFile Open strFile For Binary As #hFile OpenTextFileToString = Space(LOF(hFile)) Get hFile, , OpenTextFileToString Close #hFile Exit Function ERROROUT: If hFile 0 Then Close #hFile End If End Function Sub Test() Dim i As Long Dim n As Long Dim str As String Dim arr1 Dim arr2() As String str = OpenTextFileToString("C:\testfile.txt") arr1 = Split(str, vbCrLf) ReDim arr2(0 To UBound(arr1)) As String For i = 0 To UBound(arr1) If InStr(1, arr1(i), "layer_", vbBinaryCompare) 0 Then arr2(n) = arr1(i) n = n + 1 End If Next i ReDim Preserve arr2(0 To n - 1) As String 'to check we got it right For i = 0 To UBound(arr2) MsgBox arr2(i), , i Next i End Sub RBS "Varun" wrote in message ... Guys, I'd like to open and parse a file such that when I parse, only lines with certain text in them get included into my array. How can I accomplish this? For example, let say that file contents are as follows: text in line 1 text in line 2 layer_1 layer_2 layer_3 I'd like to save the lines with layer_1, layer_2, and layer_3 in my array named line. Here's what I have so far - what should I do next? Sub geomsasciiparse() Dim Buf() As String Dim logical_layer As Variant Dim line() As String Dim objFSO As Object Dim objGeomsAsciiFile As Object Set objFSO = CreateObject("Scripting.FileSystemObject") Set objGeomsAsciiFile = objFSO.OpenTextFile(MentDesContPath & "\geoms_ascii") strBuffer = objGeomsAsciiFile.Readline Do While Not objGeomsAsciiFile.AtEndOfStream If InStr(strBuffer, "layer") = 1 Then End If Thanks for help. |
#4
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
That's pretty cool Rick!
you can't use this method to only output "layer_1" and "layer_2" skipping over "layer_3"... maybe - LinesOut = Join(Filter(Filter(LinesIn, "layer_", True, vbTextCompare), _ "layer_3", False, vbTextCompare), vbCrLf) Regards, Peter T "Rick Rothstein" wrote in message ... The following code will output all the lines containing the text "layers_" **anywhere** within them. Notice that you can't pick and choose a subset of all the "layer_" lines; that is, you can't use this method to only output "layer_1" and "layer_2" skipping over "layer_3"... the search text that gets used in the Filter function works like that in the InStr function. Oh, and change the file names for the input and output files. Sub ReadProcessOutput() Dim FileNum As Long Dim TotalFile As String Dim LinesOut As String Dim LinesIn() As String FileNum = FreeFile Open "d:\temp\Test.txt" For Binary As #FileNum TotalFile = Space(LOF(FileNum)) Get #FileNum, , TotalFile Close #FileNum LinesIn = Split(TotalFile, vbCrLf) LinesOut = Join(Filter(LinesIn, "layer_", True, vbTextCompare), vbCrLf) FileNum = FreeFile Open "d:\temp\OutTest.txt" For Output As #FileNum Print #FileNum, LinesOut Close #FileNum End Sub -- Rick (MVP - Excel) "RB Smissaert" wrote in message ... Function OpenTextFileToString(strFile As String) As String Dim hFile As Long On Error GoTo ERROROUT hFile = FreeFile Open strFile For Binary As #hFile OpenTextFileToString = Space(LOF(hFile)) Get hFile, , OpenTextFileToString Close #hFile Exit Function ERROROUT: If hFile 0 Then Close #hFile End If End Function Sub Test() Dim i As Long Dim n As Long Dim str As String Dim arr1 Dim arr2() As String str = OpenTextFileToString("C:\testfile.txt") arr1 = Split(str, vbCrLf) ReDim arr2(0 To UBound(arr1)) As String For i = 0 To UBound(arr1) If InStr(1, arr1(i), "layer_", vbBinaryCompare) 0 Then arr2(n) = arr1(i) n = n + 1 End If Next i ReDim Preserve arr2(0 To n - 1) As String 'to check we got it right For i = 0 To UBound(arr2) MsgBox arr2(i), , i Next i End Sub RBS "Varun" wrote in message ... Guys, I'd like to open and parse a file such that when I parse, only lines with certain text in them get included into my array. How can I accomplish this? For example, let say that file contents are as follows: text in line 1 text in line 2 layer_1 layer_2 layer_3 I'd like to save the lines with layer_1, layer_2, and layer_3 in my array named line. Here's what I have so far - what should I do next? Sub geomsasciiparse() Dim Buf() As String Dim logical_layer As Variant Dim line() As String Dim objFSO As Object Dim objGeomsAsciiFile As Object Set objFSO = CreateObject("Scripting.FileSystemObject") Set objGeomsAsciiFile = objFSO.OpenTextFile(MentDesContPath & "\geoms_ascii") strBuffer = objGeomsAsciiFile.Readline Do While Not objGeomsAsciiFile.AtEndOfStream If InStr(strBuffer, "layer") = 1 Then End If Thanks for help. |
#5
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
Yes, very good Peter, that does seem to work. "Pretty cool" back at you.
-- Rick (MVP - Excel) "Peter T" <peter_t@discussions wrote in message ... That's pretty cool Rick! you can't use this method to only output "layer_1" and "layer_2" skipping over "layer_3"... maybe - LinesOut = Join(Filter(Filter(LinesIn, "layer_", True, vbTextCompare), _ "layer_3", False, vbTextCompare), vbCrLf) Regards, Peter T "Rick Rothstein" wrote in message ... The following code will output all the lines containing the text "layers_" **anywhere** within them. Notice that you can't pick and choose a subset of all the "layer_" lines; that is, you can't use this method to only output "layer_1" and "layer_2" skipping over "layer_3"... the search text that gets used in the Filter function works like that in the InStr function. Oh, and change the file names for the input and output files. Sub ReadProcessOutput() Dim FileNum As Long Dim TotalFile As String Dim LinesOut As String Dim LinesIn() As String FileNum = FreeFile Open "d:\temp\Test.txt" For Binary As #FileNum TotalFile = Space(LOF(FileNum)) Get #FileNum, , TotalFile Close #FileNum LinesIn = Split(TotalFile, vbCrLf) LinesOut = Join(Filter(LinesIn, "layer_", True, vbTextCompare), vbCrLf) FileNum = FreeFile Open "d:\temp\OutTest.txt" For Output As #FileNum Print #FileNum, LinesOut Close #FileNum End Sub -- Rick (MVP - Excel) "RB Smissaert" wrote in message ... Function OpenTextFileToString(strFile As String) As String Dim hFile As Long On Error GoTo ERROROUT hFile = FreeFile Open strFile For Binary As #hFile OpenTextFileToString = Space(LOF(hFile)) Get hFile, , OpenTextFileToString Close #hFile Exit Function ERROROUT: If hFile 0 Then Close #hFile End If End Function Sub Test() Dim i As Long Dim n As Long Dim str As String Dim arr1 Dim arr2() As String str = OpenTextFileToString("C:\testfile.txt") arr1 = Split(str, vbCrLf) ReDim arr2(0 To UBound(arr1)) As String For i = 0 To UBound(arr1) If InStr(1, arr1(i), "layer_", vbBinaryCompare) 0 Then arr2(n) = arr1(i) n = n + 1 End If Next i ReDim Preserve arr2(0 To n - 1) As String 'to check we got it right For i = 0 To UBound(arr2) MsgBox arr2(i), , i Next i End Sub RBS "Varun" wrote in message ... Guys, I'd like to open and parse a file such that when I parse, only lines with certain text in them get included into my array. How can I accomplish this? For example, let say that file contents are as follows: text in line 1 text in line 2 layer_1 layer_2 layer_3 I'd like to save the lines with layer_1, layer_2, and layer_3 in my array named line. Here's what I have so far - what should I do next? Sub geomsasciiparse() Dim Buf() As String Dim logical_layer As Variant Dim line() As String Dim objFSO As Object Dim objGeomsAsciiFile As Object Set objFSO = CreateObject("Scripting.FileSystemObject") Set objGeomsAsciiFile = objFSO.OpenTextFile(MentDesContPath & "\geoms_ascii") strBuffer = objGeomsAsciiFile.Readline Do While Not objGeomsAsciiFile.AtEndOfStream If InStr(strBuffer, "layer") = 1 Then End If Thanks for help. |
#6
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
OK, it is a one-liner, but is it faster than Instr in a loop?
Will test in a bit, unless somebody else will do that ... RBS "Rick Rothstein" wrote in message ... Yes, very good Peter, that does seem to work. "Pretty cool" back at you. -- Rick (MVP - Excel) "Peter T" <peter_t@discussions wrote in message ... That's pretty cool Rick! you can't use this method to only output "layer_1" and "layer_2" skipping over "layer_3"... maybe - LinesOut = Join(Filter(Filter(LinesIn, "layer_", True, vbTextCompare), _ "layer_3", False, vbTextCompare), vbCrLf) Regards, Peter T "Rick Rothstein" wrote in message ... The following code will output all the lines containing the text "layers_" **anywhere** within them. Notice that you can't pick and choose a subset of all the "layer_" lines; that is, you can't use this method to only output "layer_1" and "layer_2" skipping over "layer_3"... the search text that gets used in the Filter function works like that in the InStr function. Oh, and change the file names for the input and output files. Sub ReadProcessOutput() Dim FileNum As Long Dim TotalFile As String Dim LinesOut As String Dim LinesIn() As String FileNum = FreeFile Open "d:\temp\Test.txt" For Binary As #FileNum TotalFile = Space(LOF(FileNum)) Get #FileNum, , TotalFile Close #FileNum LinesIn = Split(TotalFile, vbCrLf) LinesOut = Join(Filter(LinesIn, "layer_", True, vbTextCompare), vbCrLf) FileNum = FreeFile Open "d:\temp\OutTest.txt" For Output As #FileNum Print #FileNum, LinesOut Close #FileNum End Sub -- Rick (MVP - Excel) "RB Smissaert" wrote in message ... Function OpenTextFileToString(strFile As String) As String Dim hFile As Long On Error GoTo ERROROUT hFile = FreeFile Open strFile For Binary As #hFile OpenTextFileToString = Space(LOF(hFile)) Get hFile, , OpenTextFileToString Close #hFile Exit Function ERROROUT: If hFile 0 Then Close #hFile End If End Function Sub Test() Dim i As Long Dim n As Long Dim str As String Dim arr1 Dim arr2() As String str = OpenTextFileToString("C:\testfile.txt") arr1 = Split(str, vbCrLf) ReDim arr2(0 To UBound(arr1)) As String For i = 0 To UBound(arr1) If InStr(1, arr1(i), "layer_", vbBinaryCompare) 0 Then arr2(n) = arr1(i) n = n + 1 End If Next i ReDim Preserve arr2(0 To n - 1) As String 'to check we got it right For i = 0 To UBound(arr2) MsgBox arr2(i), , i Next i End Sub RBS "Varun" wrote in message ... Guys, I'd like to open and parse a file such that when I parse, only lines with certain text in them get included into my array. How can I accomplish this? For example, let say that file contents are as follows: text in line 1 text in line 2 layer_1 layer_2 layer_3 I'd like to save the lines with layer_1, layer_2, and layer_3 in my array named line. Here's what I have so far - what should I do next? Sub geomsasciiparse() Dim Buf() As String Dim logical_layer As Variant Dim line() As String Dim objFSO As Object Dim objGeomsAsciiFile As Object Set objFSO = CreateObject("Scripting.FileSystemObject") Set objGeomsAsciiFile = objFSO.OpenTextFile(MentDesContPath & "\geoms_ascii") strBuffer = objGeomsAsciiFile.Readline Do While Not objGeomsAsciiFile.AtEndOfStream If InStr(strBuffer, "layer") = 1 Then End If Thanks for help. |
#7
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
LinesOut = Join(Filter(LinesIn, "layer_", True, vbTextCompare), vbCrLf)
OK, that is another way, but as you say you still may need Instr if you want layer_1, layer_2, layer_3, but not layer_4. RBS "Rick Rothstein" wrote in message ... The following code will output all the lines containing the text "layers_" **anywhere** within them. Notice that you can't pick and choose a subset of all the "layer_" lines; that is, you can't use this method to only output "layer_1" and "layer_2" skipping over "layer_3"... the search text that gets used in the Filter function works like that in the InStr function. Oh, and change the file names for the input and output files. Sub ReadProcessOutput() Dim FileNum As Long Dim TotalFile As String Dim LinesOut As String Dim LinesIn() As String FileNum = FreeFile Open "d:\temp\Test.txt" For Binary As #FileNum TotalFile = Space(LOF(FileNum)) Get #FileNum, , TotalFile Close #FileNum LinesIn = Split(TotalFile, vbCrLf) LinesOut = Join(Filter(LinesIn, "layer_", True, vbTextCompare), vbCrLf) FileNum = FreeFile Open "d:\temp\OutTest.txt" For Output As #FileNum Print #FileNum, LinesOut Close #FileNum End Sub -- Rick (MVP - Excel) "RB Smissaert" wrote in message ... Function OpenTextFileToString(strFile As String) As String Dim hFile As Long On Error GoTo ERROROUT hFile = FreeFile Open strFile For Binary As #hFile OpenTextFileToString = Space(LOF(hFile)) Get hFile, , OpenTextFileToString Close #hFile Exit Function ERROROUT: If hFile 0 Then Close #hFile End If End Function Sub Test() Dim i As Long Dim n As Long Dim str As String Dim arr1 Dim arr2() As String str = OpenTextFileToString("C:\testfile.txt") arr1 = Split(str, vbCrLf) ReDim arr2(0 To UBound(arr1)) As String For i = 0 To UBound(arr1) If InStr(1, arr1(i), "layer_", vbBinaryCompare) 0 Then arr2(n) = arr1(i) n = n + 1 End If Next i ReDim Preserve arr2(0 To n - 1) As String 'to check we got it right For i = 0 To UBound(arr2) MsgBox arr2(i), , i Next i End Sub RBS "Varun" wrote in message ... Guys, I'd like to open and parse a file such that when I parse, only lines with certain text in them get included into my array. How can I accomplish this? For example, let say that file contents are as follows: text in line 1 text in line 2 layer_1 layer_2 layer_3 I'd like to save the lines with layer_1, layer_2, and layer_3 in my array named line. Here's what I have so far - what should I do next? Sub geomsasciiparse() Dim Buf() As String Dim logical_layer As Variant Dim line() As String Dim objFSO As Object Dim objGeomsAsciiFile As Object Set objFSO = CreateObject("Scripting.FileSystemObject") Set objGeomsAsciiFile = objFSO.OpenTextFile(MentDesContPath & "\geoms_ascii") strBuffer = objGeomsAsciiFile.Readline Do While Not objGeomsAsciiFile.AtEndOfStream If InStr(strBuffer, "layer") = 1 Then End If Thanks for help. |
#8
![]()
Posted to microsoft.public.excel.programming
|
|||
|
|||
![]()
I actually meant to post my message directly under the OP's posting, not
yours... sorry. -- Rick (MVP - Excel) "RB Smissaert" wrote in message ... LinesOut = Join(Filter(LinesIn, "layer_", True, vbTextCompare), vbCrLf) OK, that is another way, but as you say you still may need Instr if you want layer_1, layer_2, layer_3, but not layer_4. RBS "Rick Rothstein" wrote in message ... The following code will output all the lines containing the text "layers_" **anywhere** within them. Notice that you can't pick and choose a subset of all the "layer_" lines; that is, you can't use this method to only output "layer_1" and "layer_2" skipping over "layer_3"... the search text that gets used in the Filter function works like that in the InStr function. Oh, and change the file names for the input and output files. Sub ReadProcessOutput() Dim FileNum As Long Dim TotalFile As String Dim LinesOut As String Dim LinesIn() As String FileNum = FreeFile Open "d:\temp\Test.txt" For Binary As #FileNum TotalFile = Space(LOF(FileNum)) Get #FileNum, , TotalFile Close #FileNum LinesIn = Split(TotalFile, vbCrLf) LinesOut = Join(Filter(LinesIn, "layer_", True, vbTextCompare), vbCrLf) FileNum = FreeFile Open "d:\temp\OutTest.txt" For Output As #FileNum Print #FileNum, LinesOut Close #FileNum End Sub -- Rick (MVP - Excel) "RB Smissaert" wrote in message ... Function OpenTextFileToString(strFile As String) As String Dim hFile As Long On Error GoTo ERROROUT hFile = FreeFile Open strFile For Binary As #hFile OpenTextFileToString = Space(LOF(hFile)) Get hFile, , OpenTextFileToString Close #hFile Exit Function ERROROUT: If hFile 0 Then Close #hFile End If End Function Sub Test() Dim i As Long Dim n As Long Dim str As String Dim arr1 Dim arr2() As String str = OpenTextFileToString("C:\testfile.txt") arr1 = Split(str, vbCrLf) ReDim arr2(0 To UBound(arr1)) As String For i = 0 To UBound(arr1) If InStr(1, arr1(i), "layer_", vbBinaryCompare) 0 Then arr2(n) = arr1(i) n = n + 1 End If Next i ReDim Preserve arr2(0 To n - 1) As String 'to check we got it right For i = 0 To UBound(arr2) MsgBox arr2(i), , i Next i End Sub RBS "Varun" wrote in message ... Guys, I'd like to open and parse a file such that when I parse, only lines with certain text in them get included into my array. How can I accomplish this? For example, let say that file contents are as follows: text in line 1 text in line 2 layer_1 layer_2 layer_3 I'd like to save the lines with layer_1, layer_2, and layer_3 in my array named line. Here's what I have so far - what should I do next? Sub geomsasciiparse() Dim Buf() As String Dim logical_layer As Variant Dim line() As String Dim objFSO As Object Dim objGeomsAsciiFile As Object Set objFSO = CreateObject("Scripting.FileSystemObject") Set objGeomsAsciiFile = objFSO.OpenTextFile(MentDesContPath & "\geoms_ascii") strBuffer = objGeomsAsciiFile.Readline Do While Not objGeomsAsciiFile.AtEndOfStream If InStr(strBuffer, "layer") = 1 Then End If Thanks for help. |
Reply |
Thread Tools | Search this Thread |
Display Modes | |
|
|
![]() |
||||
Thread | Forum | |||
number of lines and characters in a text file | Excel Programming | |||
Copying certain lines from a text file | Excel Discussion (Misc queries) | |||
Deleting text file lines | Excel Programming | |||
excel97 vba to append lines to text file overwriting last 2 lines | Excel Programming | |||
FileSystemObject to get last 10 lines of text file. | Excel Programming |