excel的VBA;编辑非常大的文件

excel的VBA;编辑非常大的文件,excel,large-files,large-data-volumes,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; 17041

我有一组非常大的日志文件,其中包含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]
Sub TestMe()

    On Error GoTo ASD
    Dim objFSO As Object
    Dim objFile As Object
    Dim x&, i&, strLine$, a&, b&, iLineNumber&
    Const ForReading = 1
    Const ForWriting = 2

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile("C:\Users\v.doynov\Desktop\nd.txt")

    x = 1
    Dim newString As String
    Do
        Do While i < 1000
            strLine = objFile.ReadLine
            If InStr(strLine, " 0.0kt") <> 29 Then 'Sample was 29 on my machine, not 28.
                newString = newString & strLine & vbCrLf
            End If
            i = i + 1
        Loop
    Loop

ASD:

    objFile.Close
    Set objFile = objFSO.OpenTextFile("C:\Users\v.doynov\Desktop\nd.txt", ForWriting)
    objFile.Write newString
    objFile.Close

End Sub
每个文件大约有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
子测试()
'这将在到达文件末尾时强制脚本结束
关于转到ASD的错误
常数ForReading=1
写入常数=2
设置objFSO=CreateObject(“Scripting.FileSystemObject”)
设置objFile=objFSO.OpenTextFile(“C:\x\170418.log”,用于读取)
x=1
做
当我<1000时做
strline=objFile.ReadLine
如果仪表(斯特林,“0.0kt”)=28,则
strline=”“&vbCrLf
如果结束
i=i+1
环
'doevents和一个在1000行之后调用doevents的计算,以防止脚本冻结
多芬特
a=a+1
b=a*1000
i=i+b
x=i/1000
i=0
Ilinumber=x
环
建筑署:
objFile.Close
设置objFile=objFSO.OpenTextFile(“C:\x\170418.log”,用于写入)
写strline
objFile.Close
端接头
在删除所有包含“0.0kt”的行而不是删除所有行的情况下,保存和关闭文件时,我缺少什么


感谢使用您的代码,我想出了如下方法:

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]
Sub TestMe()

    On Error GoTo ASD
    Dim objFSO As Object
    Dim objFile As Object
    Dim x&, i&, strLine$, a&, b&, iLineNumber&
    Const ForReading = 1
    Const ForWriting = 2

    Set objFSO = CreateObject("Scripting.FileSystemObject")
    Set objFile = objFSO.OpenTextFile("C:\Users\v.doynov\Desktop\nd.txt")

    x = 1
    Dim newString As String
    Do
        Do While i < 1000
            strLine = objFile.ReadLine
            If InStr(strLine, " 0.0kt") <> 29 Then 'Sample was 29 on my machine, not 28.
                newString = newString & strLine & vbCrLf
            End If
            i = i + 1
        Loop
    Loop

ASD:

    objFile.Close
    Set objFile = objFSO.OpenTextFile("C:\Users\v.doynov\Desktop\nd.txt", ForWriting)
    objFile.Write newString
    objFile.Close

End Sub
subtestme()
关于转到ASD的错误
作为对象的Dim objFSO
Dim objFile作为对象
尺寸x&,i&,strLine$,a&,b&,iLineNumber&
常数ForReading=1
写入常数=2
设置objFSO=CreateObject(“Scripting.FileSystemObject”)
设置objFile=objFSO.OpenTextFile(“C:\Users\v.doynov\Desktop\nd.txt”)
x=1
将新闻字符串变暗为字符串
做
当我<1000时做
strLine=objFile.ReadLine
如果InStr(strLine,“0.0kt”)29,那么我的机器上的样本是29,而不是28。

newString=newString&strLine&vbCrLf 如果结束 i=i+1 环 环 建筑署: objFile.Close 设置objFile=objFSO.OpenTextFile(“C:\Users\v.doynov\Desktop\nd.txt”,用于写入) objFile.Write新闻字符串 objFile.Close 端接头


它检查
If InStr(strLine,“0.0kt”)29是否为
,如果为
,则将该行指向
新闻字符串。最后,保存了
新闻字符串。

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

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

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

strline=objFile.ReadLine
-这会将行复制到变量中,然后更改
strline
,对文件的内容不做任何更改。构建另一个您想要的行字符串,然后将其写回文件。当您写入文件(在子文件末尾)时,您只写入从第一个文件读取的最后一行。newString=newString&strLine&vbCrLf此行似乎用相同的字符串替换现有字符串(因为它使用strLine作为输入)。如果我用“”替换strLine,结果仍然会得到一个空文件。