Страница: 1 |
не ужели нет функции которая возвращает число строк в файле?
Страница: 1 |
Вопрос: как узнать число строк в ткстовом файле?
Добавлено: 08.06.04 13:09
Автор вопроса: Dima34
Ответы
Всего ответов: 15
Номер ответа: 1
Автор ответа:
Иришка
Вопросов: 1
Ответов: 1
Профиль | | #1
Добавлено: 08.06.04 13:48
Не припомню функцию.
Можно открыть файл на Input "пока" не конец и посчитать в числовую переменную количество проходов.
Номер ответа: 2
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #2
Добавлено: 08.06.04 13:57
А можно считать весь файл, вызвать функцию Split, со вторым параметром - vbCrLf
Номер ответа: 3
Автор ответа:
Dima34
Вопросов: 4
Ответов: 4
Профиль | | #3
Добавлено: 08.06.04 14:30
Это всё можно сделать, но по моему это всё не совсем правильно. Например в моём случае размер файла 65 мб. Так что к случай со считывангием всего файла отпадает. Да и проход всего файла в цикле со счетчиком тоже наверное лишнее. Например мне нужно определить серединуфайла(для бинаргого поиска) не ужели для этого я должен посчитать сколько строк в файле?
Не ужели нет других способов?
Номер ответа: 4
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #4
Добавлено: 08.06.04 14:36
Считать кол во строк в файле ты должен в любом случаи... +) как ты можешь что то узнать не посчитать так как ... строки ... это лишь тебе на глаз строки а так этот один прямой поток байт....
есть дурацкий способ ...
лучше делай на АПИ может быстрей будет .... читай по два байта и если они являются знаком переноса строки помоему 0a 10 не помню... счётчик кол во строк инскриминируешь... и можешь запоминать оффсет строки... и её длинну соотсвенно чтоб потом было проще +)
Номер ответа: 5
Автор ответа:
Fallout
Вопросов: 10
Ответов: 387
Web-сайт:
Профиль | | #5
Добавлено: 08.06.04 14:39
блин тормоз +)
то бишь 0D0A +)
Номер ответа: 6
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #6
Добавлено: 08.06.04 19:32
Следовательно, бери и смотри весь файл на наличие этих двух байт... Долго на ВБ !? Ничего, пиши на др. языке С такими файлами - лучше на С++ или АСМ... все более медленное - МЕДЛЕННОЕ
Номер ответа: 7
Автор ответа:
TERMIT
ICQ: 5297101
Вопросов: 16
Ответов: 93
Web-сайт:
Профиль | | #7
Добавлено: 08.06.04 20:56
Вот на держи......работает реально.....
Private Sub Command1_Click()
MsgBox CalculateLines(Text1)
End Sub
Public Function CalculateLines(TextBox1 As TextBox) As Long
Dim i As Long
Dim Str As String
Dim Lines As Long
Lines = 1
Str = TextBox1.Text
On Error Resume Next
For i = 1 To Len(Str)
If Asc(Mid(Str, i, 1)) = 13 Then Lines = Lines + 1
Next i
CalculateLines = Lines
End Function
удачи!!!
Номер ответа: 8
Автор ответа:
sne
Разработчик Offline Client
ICQ: 233286456
Вопросов: 34
Ответов: 5445
Web-сайт:
Профиль | | #8
Добавлено: 08.06.04 21:53
В текстБокс 64 метра никто не запихивает - рас
Это самое медленное чудо которое можно сообразить на VB - двас
Сравнение только на &HD - неверно, т.к. это совсем не обязательно то что ищем...
Номер ответа: 9
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #9
Добавлено: 08.06.04 23:41
Да, VB явно не блещет.
Даже с буфером 512 кБ гудит 11 секунд.
Если хочешь - поиграй с буфером. Всё равно код уже написан и выкидывать его жалко(у пчёлки).
---
Private Sub Command1_Click()
 im FileToRead As String
 im Position As Long
 im Free_hFile As Long
 im BufferSize As Long
 im Buffer As String
 im t1 As Single, t2 As Single
 im Count_CrLf As Long
FileToRead = "C:\PBWin70\DOC\PBForum\FORUM4.DAT"
Position = 1
Free_hFile = FreeFile
BufferSize = 524288
Buffer = Space$(BufferSize)
 im FileLen As Long
Open FileToRead For Binary As #Free_hFile
FileLen = LOF(1)
t1 = Timer
While Position < FileLen
Me.Caption = Val(Me.Caption) + 1 & " times"
Get #Free_hFile, Position, Buffer
Count_CrLf = Count_CrLf + UBound(Split(Buffer, vbCrLf))
Position = Position + BufferSize
Wend
t2 = Timer
Close #Free_hFile
Me.Caption = "Press Command1 to begin"
MsgBox "Complete at " & t2 - t1 & " sec", , "LineCount=" & Count_CrLf
End Sub
---
Можешь While...Wend заменить на For...Next. Сэкономишь пол секунды.
For Position = 1 To FileLen Step BufferSize
Get #Free_hFile, Position, Buffer
Count_CrLf = Count_CrLf + UBound(Split(Buffer, vbCrLf))
Next Position
Номер ответа: 10
Автор ответа:
@CyRax PTR
ICQ: 204447456
Вопросов: 28
Ответов: 664
Web-сайт:
Профиль | | #10
Добавлено: 08.06.04 23:42
Цикл - это не лучшая идея. За 3 секунды у меня проверил 600 кБ. Простым подсчётом получаем что на проверку 60-метрового файла уйдёт 5 минут.
Номер ответа: 11
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #11
Добавлено: 10.06.04 20:45
Попробуйте маппинг с асмом - должно быть довольно резво.
Номер ответа: 12
Автор ответа:
Chill
ICQ: 554200
Вопросов: 101
Ответов: 343
Профиль | | #12
Добавлено: 10.06.04 22:32
А ты пробовал загружать весь файл в память а потом уже искать кол-иво строк?
Номер ответа: 13
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #13
Добавлено: 10.06.04 22:49
А напиши себе DLL на РВ, там есть такие вещи :
 IM count&, y&, C AS STRING
OPEN "d:\WIN32API.INC" FOR INPUT AS #1
FILESCAN #1, RECORDS TO count&
 IM TheData(1:count& AS STRING
LINE INPUT #1, TheData() TO y&
CLOSE #1
и работать будет шибко быстро. WIN32API.INC я нарастил до более чем 400000 строк. Результ - менее секунды. И в count& сидит кол-во строк. А TheData() - массив, в котором все твои строки.
Номер ответа: 14
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #14
Добавлено: 10.06.04 22:51
Да, и размер файла WIN32API.INC - 17 Мб
Номер ответа: 15
Автор ответа:
cresta
Вопросов: 117
Ответов: 1538
Профиль | | #15
Добавлено: 10.06.04 23:42
Я тут скомпилировал эту функцию в DLL, проверил из VB - работает. Пример: количество строк 437 042, время подсчёта строк - 0.09 сек. Если надо может тебе куда на мыло скинуть?