excel - 用于 Excel 的 VBA;编辑非常大的文件

标签 excel large-files large-data-volumes vba

我有一组非常大的带有 AIS(运输)数据的日志文件。由于这些日志文件每天大约 200Mb,我正在尝试缩小它们的大小以进行归档。文件如下所示:

244630075;under way ;128°'; 0.0kt;52.395290N;4.886883E;342.0°;511°;55s; 170418 000000;serial#1(A)[1]
244670835;under way ;128°'; 0.0kt;52.410140N;4.833700E;283.8°;511°;54s; 170418 000000;serial#1(B)[3]
244750830;under way ;128°'; 0.0kt;52.404563N;4.864063E;  0.0°;511°;55s; 170418 000000;serial#1(B)[1]
244900124;under way ;000°'; 7.1kt;52.426495N;4.780100E;279.4°;281°;56s; 170418 000000;serial#1(B)[2]
244670779;under way ;000°'; 0.0kt;52.420773N;4.801418E;330.9°;325°;58s; 170418 000000;serial#1(A)[1]
244660512;under way ;128°'; 0.0kt;52.402092N;4.781258E;268.3°;511°;54s; 170418 000000;serial#1(B)[1]
236202000;under way ;000°';11.7kt;52.477408N;4.462048E;285.4°;296°;55s; 170418 000000;serial#1(B)[1]
244690403;under way ;128°'; 0.0kt;52.400760N;4.891647E;  0.0°;511°;55s; 170418 000000;serial#1(A)[1]

每个文件大约有 200 万行。为了缩小这些文件的大小,我想删除包含“0.0kt”的每一行,因为它代表的信息对我没有用。为此,我在 Excel 中编写了一个 VBA 脚本。我似乎有脚本为主要部分工作。它遍历文件并编辑出所有包含“0.0kt”的行。但是当脚本结束时,应该保存它导出一个空文件。

这是我的脚本:
Sub test()
'this will force the script to end when end of file is reached
On Error GoTo ASD

Const ForReading = 1
Const ForWriting = 2

Set objFSO = CreateObject("Scripting.FileSystemObject")
Set objFile = objFSO.OpenTextFile("C:\x\170418.log", ForReading)

x = 1

Do
Do While i < 1000

        strline = objFile.ReadLine
         If InStr(strline, " 0.0kt") = 28 Then
            strline = "" & vbCrLf

        End If
    i = i + 1

Loop

'doevents and a calculation to call doevents after 1000 lines to prevent freezing of the script
DoEvents
a = a + 1
b = a * 1000
i = i + b
x = i / 1000
i = 0
iLineNumber = x

Loop

ASD:

objFile.Close

Set objFile = objFSO.OpenTextFile("C:\x\170418.log", ForWriting)
objFile.Write strline

objFile.Close

End Sub

在删除所有包含“0.0kt”的行而不是删除所有行的情况下保存和关闭文件,我缺少什么?

谢谢

最佳答案

查看您的示例文本,我认为任何包含 ; 0.0kt; 的行可以排除。

使用我已经构建的东西,我已经对其进行了调整以获取您的文件并使用您的DoEvents每 1000 行。

Sub Test()

    Dim ifileno As Integer, ofileno As Integer, rownum As Long
    Dim ifilename As String, ofilename As String, excludestring As String, strLine As String

    ifilename = "C:\Users\v.doynov\Desktop\nd.txt"
    ofilename = "C:\Users\v.doynov\Desktop\nd_output.txt"
    excludestring = "; 0.0kt;"

    ifileno = FreeFile
    Open ifilename For Input As ifileno

    ofileno = FreeFile
    Open ofilename For Output As ofileno

    rownum = 0

    Do Until EOF(ifileno)
        rownum = rownum + 1
        Line Input #ifileno, strLine
        If InStr(strLine, excludestring) = 0 Then Print #ofileno, strLine
        If rownum Mod 1000 = 0 Then DoEvents
    Loop

    Close ifileno
    Close ofileno

End Sub

关于excel - 用于 Excel 的 VBA;编辑非常大的文件,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50465698/

相关文章:

html - 创建 HTML 表格并在保存样式的 Excel 中打开它

java - 如何使用 apache poi 读取 xlsx 类型的 Excel 文件的单元格内容?

sorting - 如何随机排序一个大文件

node.js - 使用 NodeJS 流式传输大型静态文件

web-services - Web 服务中序列化的成本

r - 在 R 中绘制非常大的数据集

vba - 合并两列但仅合并某些单元格?

vba - 将 div0 错误更改为一个值(获取错误 13)vba excel

java - 适用于 Java 的优秀且有效的 CSV/TSV 阅读器

java - 我如何允许用户轻松地选择在 Java Swing 应用程序中分配多少内存?