excel - 在 Excel VBA 中从大型文本文件复制底行

标签 excel vba parsing bigdata text-files

我在互联网上搜索了以下问题的 VBA 解决方案,但没有成功。我的文本文件包含 3-5 百万行数据(这因文本文件而异),但我只需要提取最后 12 行实际数据并将其放入 Excel 工作表中,最好用空格和制表符分隔。显然,我无法将文本文件直接加载到具有一百万行左右限制的 Excel 中,并且使用 DataTypes.Add 也不会带来任何好处。

有没有办法以分隔方式将最后几行数据导入到 Excel 中?我的数据看起来像这样

来自文本文件:

Blah blah blah 我不需要 500 万行的东西

5550203行:

Line5550204:这是这一段数据的标题

5550205行:

第5550206行:数据标题1 数据标题2 数据标题3

5550207行:

第5550208行:数据单元1 数据单元2 数据单元3

5550209行:

5550210行:数据1数据2数据3

5550211行:

第5550212行:下一部分数据的标题

5550213行:

第5550214行:数据标题1a 数据标题2a 数据标题3a

5550215行:

第5550216行:数据单元1a 数据单元2a 数据单元3a

5550217行:

第5550218行:数据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

关于excel - 在 Excel VBA 中从大型文本文件复制底行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66380806/

相关文章:

excel - 在使用 Excel 中的自定义函数计算 IRR 时需要帮助

arrays - Excel VBA : two dimensional array with variable and time stamp

c# - 在 Java 应用程序中解析 C#

C# 解析值如果不为空

excel - VBA "Application defined or object defined error"

vba - 在运行宏之前从所有工作表中删除过滤

vba - 如何在特定位置插入行

vba - Sub()s 之间的线的目的是什么?

excel - for 循环的第二次迭代中出现对象变量或 with block 变量未设置错误

c++ - 提升精神 : parse a section of an input