VBA 对于 excel;编辑非常大的文件
VBA for excel; editing very large files
我有大量包含 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:\x0418.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:\x0418.log", ForWriting)
objFile.Write strline
objFile.Close
End Sub
保存并关闭文件并删除所有包含“0.0kt”的行,而不是删除所有行,我错过了什么?
谢谢
通过使用您的代码,我得出了这样的结论:
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
它检查是否 If InStr(strLine, " 0.0kt") <> 29 Then
,如果是,则将行附加到 newString
。最后,newString
被保存。
查看您的示例文本,我认为可以排除任何包含 ; 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
我有大量包含 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:\x0418.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:\x0418.log", ForWriting)
objFile.Write strline
objFile.Close
End Sub
保存并关闭文件并删除所有包含“0.0kt”的行,而不是删除所有行,我错过了什么?
谢谢
通过使用您的代码,我得出了这样的结论:
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
它检查是否 If InStr(strLine, " 0.0kt") <> 29 Then
,如果是,则将行附加到 newString
。最后,newString
被保存。
查看您的示例文本,我认为可以排除任何包含 ; 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