Option Explicit
Private Type mType
b(7) As Byte
End Type
Private Sub Form_Load()
Dim nf1 As Integer, d1(16385) As Byte, a1 As Long, p1 As Long
Dim nf2 As Integer, d2(4095) As mType, a2 As Long
Dim i As Long
Show
Caption = "Wait..."
For a2 = 0 To 4095
d2(a2).b(6) = 13
d2(a2).b(7) = 10
Next a2
nf1 = FreeFile
Open "1.txt" For Binary As #nf1
nf2 = FreeFile
Open "2.txt" For Binary As #nf2
Close #nf2: Kill "2.txt"
Open "2.txt" For Binary As #nf2
p1 = 1
a2 = 0
Do
a1 = 0
Get #nf1, p1, d1()
Do
For i = 0 To 5
d2(a2).b(i) = d1(a1 + i + 5)
Next i
a2 = a2 + 1
If a2 = 4096 Then
a2 = 0
Put #nf2, , d2()
End If
a1 = a1 + 74
If d1(a1) <> 10 Then
a1 = a1 + 1
If d1(a1) <> 10 Then
a1 = a1 + 1
If d1(a1) <> 10 Then Exit Do
End If
End If
If a1 > 16385 - 76 Then p1 = p1 + a1: Exit Do
Loop
Loop Until EOF(1)
Close #nf2
Close #nf1
Caption = "Ok!"
End Sub
Последний пример вполне рабочий и наиболее быстрый.
Option Explicit
Private Type mType
b(7) As Byte
End Type
Dim LogDir As String
Private Sub Form_Load() '
End Sub '
Private Sub Start_Click()
Dim i As Long, j As Long
Start.Enabled = False
OpenFl
i = Timer
Prime1
j = Timer
Start.Enabled = True
MsgBox Round(j - i, 2)
End Sub
Private Sub CommEXIT_Click()
End
End Sub
Private Sub OpenFl()
On Error Resume Next '
70: CommonDialog.ShowOpen 'Открытие диалога для задания имени исходного файла
LogDir = CommonDialog.FileName 'Присвоение имени файла
If LogDir = "" Then 'Если выбран неправильный файл
MsgBox "Выбери файл!", vbOKOnly + vbExclamation, "Сообщение для непонятливых"
GoTo 70 'Цикл запроса файла архиватора 7ZIP
End If '
Form1.Caption = LogDir 'Название файла - в заголовок формы
End Sub
Private Sub Prime1()
Dim fso As New FileSystemObject, f1 As Object, f2 As Object
Dim st As String, k As Long, m() As String
Set f1 = fso.OpenTextFile(LogDir, ForReading)
Set f2 = fso.CreateTextFile("1column.txt", True)
While f1.AtEndOfLine = False
DoEvents
st = f1.ReadLine
k = k + 1
m = Split(Trim(st), " ")
f2.WriteLine (m(0))
Wend
Set fso = Nothing
Set f1 = Nothing
Set f2 = Nothing
End Sub
Private Sub Prime2()
Dim a, b, c, d, e, f, g, h As String
Dim i
Open LogDir For Input As 1
Open "Prime2.txt" For Append As 2
Do While Not EOF(1)
Input #1, a, b, c, d, e, f, g, h
Print #2, a
i = i + 1
DoEvents
Loop
Close #2
Close #1
End Sub
Private Sub Prime3()
Dim nf1 As Integer, d1(4095) As Byte, a1 As Long, p1 As Long
Dim nf2 As Integer, d2(4095) As mType, a2 As Long
Dim i As Long
Show
For a2 = 0 To 4095
d2(a2).b(6) = 13
d2(a2).b(7) = 10
Next a2
nf1 = FreeFile
Open LogDir For Binary As #nf1
nf2 = FreeFile
Open "2.txt" For Binary As #nf2
p1 = 1
a2 = 0
Do
a1 = 0
Get #nf1, p1, d1()
Do
For i = 0 To 5
d2(a2).b(i) = d1(a1 + i + 5)
Next i
a2 = a2 + 1
If a2 = 4096 Then
a2 = 0
Put #nf2, , d2()
End If
If d1(a1 + 60) = 10 Then a1 = a1 + 61 Else a1 = a1 + 60
If a1 > 4095 - 60 Then p1 = p1 + a1: Exit Do
Loop
Loop Until EOF(1)
For i = 0 To a2 - 1
Put #nf2, , d2(i)
Next i
Close #nf2
Close #nf1
End Sub
Private Sub Prime4()
Dim nf1 As Integer, d1(4095) As Byte, a1 As Long, p1 As Long
Dim nf2 As Integer, d2(4095) As mType, a2 As Long
Dim i As Long
Show
For a2 = 0 To 4095
d2(a2).b(6) = 13
d2(a2).b(7) = 10
Next a2
nf1 = FreeFile
Open LogDir For Binary As #nf1
nf2 = FreeFile
Open "2.txt" For Binary As #nf2
p1 = 1
a2 = 0
Do
a1 = 0
Get #nf1, p1, d1()
Do
For i = 0 To 5
d2(a2).b(i) = d1(a1 + i + 10)
Next i
a2 = a2 + 1
If a2 = 4096 Then
a2 = 0
Put #nf2, , d2()
End If
If d1(a1 + 65) = 10 Then a1 = a1 + 66 Else a1 = a1 + 65
If a1 > 4095 - 68 Then p1 = p1 + a1: Exit Do
Loop
Loop Until EOF(1)
For i = 0 To a2 - 1
Put #nf2, , d2(i)
Next i
Close #nf2
Close #nf1
Caption = "Ok!"
End Sub
Private Sub Prime5()
Dim nf1 As Integer, d1(16385) As Byte, a1 As Long, p1 As Long
Dim nf2 As Integer, d2(4095) As mType, a2 As Long
Dim i As Long
For a2 = 0 To 4095
d2(a2).b(6) = 13
d2(a2).b(7) = 10
Next a2
nf1 = FreeFile
Open LogDir For Binary As #nf1
nf2 = FreeFile
Open "2.txt" For Binary As #nf2
Close #nf2: Kill "2.txt"
Open "2.txt" For Binary As #nf2
p1 = 1
a2 = 0
Do
a1 = 0
Get #nf1, p1, d1()
Do
For i = 0 To 5
d2(a2).b(i) = d1(a1 + i + 5)
Next i
a2 = a2 + 1
If a2 = 4096 Then
a2 = 0
Put #nf2, , d2()
End If
a1 = a1 + 74
If d1(a1) <> 10 Then
a1 = a1 + 1
If d1(a1) <> 10 Then
a1 = a1 + 1
If d1(a1) <> 10 Then Exit Do
End If
End If
If a1 > 16385 - 76 Then p1 = p1 + a1: Exit Do
Loop
Loop Until EOF(1)
Close #nf2
Close #nf1
End Sub
1893 0
.484 0
999.00
26.315
-
-2
51 0.0
Хакер писал(а):Вопрос: как вы организуете замеры скорости? Ведь у вас нет большого файла? Или автор кинул 4-гиговый файл вам по почте?
И потому не может быть исправлен, чтобы стать пригодным?Хакер писал(а):И потом обломаться от того, что метод быстр, но абсолютно непригоден для работы с файлами > 2gb?
Mikle писал(а):Варианты 3 и 4 выкинь - они сделаны по неверному представлению об исходном файле.
Вариант 5 не обработает больше 2Гб, дальше Long переполнится.
Про работу с большими файлами здесь была тема на форуме, поищи.
k = k + 1
Хакер писал(а):И потом обломаться от того, что метод быстр, но абсолютно непригоден для работы с файлами > 2gb?
Dimon111 писал(а):Нужно выделить в логе (текстовый файл) размером 1-2Гб первый столбец
Mikle писал(а):Я ориентировался на первый пост:Dimon111 писал(а):Нужно выделить в логе (текстовый файл) размером 1-2Гб первый столбец
Хакер писал(а):Ты гарантируешь, что объём не выйдет за границы положительных значений Long-а? Точно гарантируешь? А то с критериями границ столбца ты уже прогарантировался.
Prime2. Красивый, но похоже бесконечный. Формирует пустой файл.
Sub Комманда1_Click()
Dim a, b, c, d, e, f, g, h As String
Dim i
Open "C:\LOG.txt" For Output As 3
Print #3,
Close #3
Open "C:\LOG.txt" For Append As 3
Print #3, "Мой вариант"
Dim FSO, s
Set FSO = CreateObject("Scripting.FileSystemObject")
Set f = FSO.GetFile("C:\dat.txt")
s = f.Name & " занимает " & f.Size & " байт"
Print #3, s
Print #3, " Начало работы " & Time
Set f = Nothing
Set FSO = Nothing
Open "C:\dat.txt" For Input As 1
Open "C:\test1.txt" For Output As 2
Print #2,
Close #2
Open "C:\test1.txt" For Append As 2
Do While Not EOF(1)
Input #1, a, b, c, d, e, f, g, h
Print #2, a
i = i + 1
DoEvents
Loop
Close #2
Close #1
Print #3, " обработано строк " & i
Set FSO = CreateObject("Scripting.FileSystemObject")
Set f = FSO.GetFile("C:\test1.txt")
s = f.Name & " занимает " & f.Size & " байт"
Print #3, s
Print #3, " Конец работы " & Time
Set f = Nothing
Set FSO = Nothing
Close #3
Комманда4_Click
End Sub
Private Sub Комманда4_Click()
Dim FSO As New FileSystemObject
Dim f1 As Object, f2 As Object, f3 As Object
Dim st As String, i, j As Long, k As Long, m() As String
k = 0
Set f1 = FSO.OpenTextFile("c:\dat.txt", ForReading)
Set f2 = FSO.CreateTextFile("c:\test2.txt", True)
Open "C:\LOG.txt" For Append As 3
Print #3,
Print #3, "ФЗО"
Print #3, "начало " & Time
i = Time
While f1.AtEndOfLine = False
DoEvents
If k = 9999 Then
k = k
End If
st = f1.ReadLine
k = k + 1
m = Split(Trim(st), " ")
f2.WriteLine (m(0))
Wend
Set f1 = Nothing
Set f2 = Nothing
Set FSO = CreateObject("Scripting.FileSystemObject")
Set f = FSO.GetFile("C:\test2.txt")
s = f.Name & " занимает " & f.Size & " байт"
Print #3, "обработано строк " & k
Print #3, s
i = Time
Print #3, "конец " & Time
Print #3,
Close #3
Set FSO = Nothing
Set f3 = Nothing
End Sub
Dim a, b, c, d, e, f, g, h As String
Dim i
Dim st As String, start As Long, m() As String
start = Timer
Open "c:\2.dat" For Input As #1
Open "c:\3.dat" For Binary As #2
While Not EOF(1)
DoEvents
Line Input #1, st
m = Split(Trim(st), " ")
Put #2, , m(0) & vbCrLf
Wend
Close
MsgBox "время: " & Str(Timer - start)
Input #1, a, b, c, d, e, f, g, h
Print #2, a
Line Input #1, st
m = Split(Trim(st), " ")
Put #2, , m(0) & vbCrLf
А что такое З
у тебя только h as string,
50 миллионов строк это да - много.
Замедление на Line Input достаточно серьезное.
Тут возникает вопрос о плате за скорость.
Скажу по-другому: ограничивать ли способы решения средствами VB, или есть готовность ради скорости употребить любые средства?
Спрашиваю потому, что есть набор функций с префиксом mmio: mmioOpen, mmioRead, mmioClose (там их больше - я только часть привел). Скорость - быстрее не бывает. Но требуется самому управлять буферизацией, дальнейшей разбивкой на строки и пр. Особо ничего сложного, но все же...
Prime5. Самый интересный. но начало не совпадает с исходным столбцом.
Файл 1ГБ обработал за 24с. Сформировал правильный файл.
Сейчас этот форум просматривают: AhrefsBot и гости: 59