我已经搜索了互联网寻找下面问题的VBA解决方案,但无济于事。我的文本文件范围在3-5百万行(这从文本文件到文本文件不同)的数据,但我只需要提取最后12行实际数据,并放入一个Excel表格,最好由空格和制表符分隔。显然,我不能将文本文件直接加载到具有100万行左右限制并使用DataTypes的Excel中。
是否有办法将这些最后几行数据以分隔的方式导入Excel ?我的数据看起来像这样
From text file:
我不需要500万行
Line5550203:
Line5550204:这是这部分数据的标题Line5550205:
Line5550206:数据1的标题数据2的标题数据3的标题
Line5550207:
Line5550208:数据单位1数据单位2数据单位3
Line5550209:
Line5550210: Data1 Data2 Data 3
Line5550211:
Line5550212:下一段数据的标题
Line5550213:
Line5550214: Title of Data 1a Title of Data 2a Title of Data 3a
Line5550215:
Line5550216:单位数据1a单位数据2a单位数据3a
Line5550217:
Line5550218:数据1a数据2a数据3a
文件结束
显然,我不想导入空行,只想导入数据。标题是可选的,我不需要单位。任何帮助或指出我在正确的方向将不胜感激。提前感谢!
出于速度的考虑,我们希望避免读取整个文件,最终只找到最后一行。
您可以使用seek
-函数从文件的任何位置读取。然而,由于这些线的长度不同,我们不知道确切的位置。下面的代码假设一个最大行长度,并计算在最大行长度时需要读取多少字节。这些字节被读入缓冲区,缓冲区被分成几行。现在我们可能会有很多行,但很容易只得到最后一个n:
Sub readfileTail(filename As String, Optional maxLines As Long = 12)
Const maxLineLen = 256
Dim f As Integer
f = FreeFile
Open filename For Binary As #f
Dim fileLen As Long, filePos As Long
fileLen = LOF(f) ' Get size of file in bytes.
filePos = fileLen - (maxLines * maxLineLen)
Dim buffer As String
Seek #f, filePos
buffer = Input((maxLines * maxLineLen), #f) ' Read character.
Dim lines() As String, i As Long, startline As Long
lines = Split(buffer, vbCrLf)
startline = UBound(lines) - maxLines + 1
If startline < 0 Then startline = 0
For i = startline To UBound(lines)
Debug.Print i, lines(i)
Next i
Close #f
End Sub
这里有一个方法:
Sub LastFewLines()
Const BUFFER As Long = 15 'last how many lines
Dim fso As Object, t, n As Long, ln, arr(0 To BUFFER), i As Long
Set fso = CreateObject("scripting.filesystemobject")
'create the dummy text file
' Set t = fso.createtextfile("C:Tempdummy.txt")
' For n = 1 To 4000000#
' t.writeline "This is line " & n
' Next n
' t.Close
Set t = fso.opentextfile("C:Tempdummy.txt", 1)
n = 0
Do While Not t.atendofstream
ln = t.readline
arr(n Mod BUFFER) = ln 'store lines, overwriting as we go
n = n + 1
Loop
t.Close
'read out last lines in correct order
For i = (n - BUFFER) To n - 1
Debug.Print arr(i Mod BUFFER)
Next i
End Sub