我想读取一次文本文件的内容,并在结果字符串上应用正则表达式。我一直无法弄清楚如何阅读文本文件。
有一种替代方法,我一直在尝试,但它无法正常工作
Set oFS = oFSO.OpenTextFile(sFilename)
num = 15
mynum = 1
Do Until oFS.AtEndOfStream
'Cells(num, mynum).Value = oFS.ReadLine
MyString = oFS.ReadLine
If Not oFS.AtEndOfStream Then
oFS.SkipLine
strStrings = Split(MyString, " ")
For intInd = LBound(strStrings) To UBound(strStrings)
Cells(num, mynum).Value = strStrings(intInd)
mynum = mynum + 1
If mynum Mod 4 = 0 Then
num = num + 1
mynum = 1
End If
Next
End If
Loop
oFS.Close
Set oFSO = Nothing
我注意到问题来自两个来源......一旦要分割的字符串长度可变,我的功能就会失败。我该怎么补丁呢?其次,我怀疑的文件内容中的一些非字符也可能导致问题。 Myfile在第三行之后有不同的空间。我能够获得前两行
DNI ROLL TEST ON 896_271209
开始定向数据测试
=> KS 32223.63 Flammas
=> SIP -7.25度
=>右90.57度
=> AZIMUTH 105.46度
=>左73.92度
=> OFFSET -1.15度
答案 0 :(得分:2)
这是我之前使用的一个非常有用的代码片段,它将整个文本文件存储在一个字符串中,然后您可以使用它(如使用正则表达式)。
Dim strFile As String
Dim intFile As Long
intFile = FreeFile
Open "C:\File.txt" For Input As #intFile
strFile = Input$(LOF(intFile), #intFile) ' LOF returns Length of File
Close #intFile
'Do what you want with strFile
<强>更新强>: 实际上,这是一种我觉得更安全的方法。我甚至展示了如何使用打开的对话框获取文件名,这非常方便:
Sub test()
Dim fileString As String
Dim fileName As String
' You can use GetOpenFilename() if you like
fileName = Application.GetOpenFilename("Text Files (*.txt,*.txt")
fileString = Space(FileLen(fileName))
Open fileName For Binary As #1
Get #1, , fileString
Close #1
' Do what you wish with fileString
MsgBox Len(fileString)
End Sub
答案 1 :(得分:1)
如果您更改此行:
Cells(num, mynum).Value = strStrings(intInd)
为:
Cells(num, mynum).Value = "'" & strStrings(intInd)
它将强制Excel将每行视为文本。我不认为它喜欢等号“=&gt;”,因为等号通常用于表示Excel中的公式。
这是我用这个改变运行时得到的输出:
这对我来说似乎没什么用处,但是我不确定这是否会提供您正在寻找的输出 - 您没有提供有关输出需要的详细信息。但这应该有助于摆脱“应用程序定义或对象定义的错误”。
如果您希望在文本上运行RegEx,请解释您正在寻找的程序,我相信我们其中一人可以帮助您编写RegEx表达式。
答案 2 :(得分:0)
我后来得到了上面的代码..
Set oFS = oFSO.OpenTextFile(sFilename)
num = 15
mynum = 1
Do Until oFS.AtEndOfStream
'Cells(num, mynum).Value = oFS.ReadLine
MyString = oFS.ReadLine
Do While InStr(MyString, " ")
MyString = Replace(MyString, " ", " ")
Loop
strStrings = Split(MyString, " ")
If UBound(strStrings) > 0 Then
For intInd = LBound(strStrings) To UBound(strStrings)
If Not strStrings(intInd) = "=>" Then
Cells(num, mynum).Value = strStrings(intInd)
mynum = mynum + 1
If mynum Mod 5 = 0 Then
num = num + 1
mynum = 1
End If
End If
Next
End If