从Excel VBA中的大型文本文件中复制底部行



我已经搜索了互联网寻找下面问题的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

最新更新