Страница: 1 |
Вопрос: как узнать число строк в ткстовом файле? | Добавлено: 08.06.04 13:09 |
Автор вопроса: ![]() |
не ужели нет функции которая возвращает число строк в файле?
|
Ответы | Всего ответов: 15 |
Номер ответа: 1 Автор ответа: ![]() ![]() Вопросов: 1 Ответов: 1 |
Профиль | Цитата | #1 | Добавлено: 08.06.04 13:48 |
Не припомню функцию.
Можно открыть файл на Input "пока" не конец и посчитать в числовую переменную количество проходов. |
Номер ответа: 2 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #2 | Добавлено: 08.06.04 13:57 |
А можно считать весь файл, вызвать функцию Split, со вторым параметром - vbCrLf |
Номер ответа: 3 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Вопросов: 4 Ответов: 4 |
Профиль | Цитата | #3 | Добавлено: 08.06.04 14:30 |
Это всё можно сделать, но по моему это всё не совсем правильно. Например в моём случае размер файла 65 мб. Так что к случай со считывангием всего файла отпадает. Да и проход всего файла в цикле со счетчиком тоже наверное лишнее. Например мне нужно определить серединуфайла(для бинаргого поиска) не ужели для этого я должен посчитать сколько строк в файле?
Не ужели нет других способов? |
Номер ответа: 4 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 10 Ответов: 387 |
Web-сайт: Профиль | Цитата | #4 | Добавлено: 08.06.04 14:36 |
Считать кол во строк в файле ты должен в любом случаи... +) как ты можешь что то узнать не посчитать так как ... строки ... это лишь тебе на глаз строки а так этот один прямой поток байт....
есть дурацкий способ ... лучше делай на АПИ может быстрей будет .... читай по два байта и если они являются знаком переноса строки помоему 0a 10 не помню... счётчик кол во строк инскриминируешь... и можешь запоминать оффсет строки... и её длинну соотсвенно чтоб потом было проще +) |
Номер ответа: 5 Автор ответа: ![]() ![]() ![]() ![]() ![]() Вопросов: 10 Ответов: 387 |
Web-сайт: Профиль | Цитата | #5 | Добавлено: 08.06.04 14:39 |
блин тормоз +)
то бишь 0D0A +) |
Номер ответа: 6 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #6 | Добавлено: 08.06.04 19:32 |
Следовательно, бери и смотри весь файл на наличие этих двух байт... Долго на ВБ !? Ничего, пиши на др. языке ![]() ![]() |
Номер ответа: 7 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() Разработчик Offline Client ICQ: 233286456 Вопросов: 34 Ответов: 5445 |
Web-сайт: Профиль | Цитата | #8 | Добавлено: 08.06.04 21:53 |
В текстБокс 64 метра никто не запихивает - рас
Это самое медленное чудо которое можно сообразить на VB - двас Сравнение только на &HD - неверно, т.к. это совсем не обязательно то что ищем... |
Номер ответа: 9 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 204447456 Вопросов: 28 Ответов: 664 |
Web-сайт: Профиль | Цитата | #9 | Добавлено: 08.06.04 23:41 |
Да, VB явно не блещет.
Даже с буфером 512 кБ гудит 11 секунд. Если хочешь - поиграй с буфером. Всё равно код уже написан и выкидывать его жалко(у пчёлки). --- Private Sub Command1_Click() ![]() ![]() ![]() ![]() ![]() ![]() ![]() FileToRead = "C:\PBWin70\DOC\PBForum\FORUM4.DAT" Position = 1 Free_hFile = FreeFile BufferSize = 524288 Buffer = Space$(BufferSize) ![]() 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 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ICQ: 204447456 Вопросов: 28 Ответов: 664 |
Web-сайт: Профиль | Цитата | #10 | Добавлено: 08.06.04 23:42 |
Цикл - это не лучшая идея. За 3 секунды у меня проверил 600 кБ. Простым подсчётом получаем что на проверку 60-метрового файла уйдёт 5 минут. |
Номер ответа: 11 Автор ответа: ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() ![]() Лидер форума ICQ: 216865379 Вопросов: 106 Ответов: 9979 |
Web-сайт: Профиль | Цитата | #11 | Добавлено: 10.06.04 20:45 |
Попробуйте маппинг с асмом - должно быть довольно резво. |
Номер ответа: 12 Автор ответа: ![]() ![]() ![]() ![]() ![]() ICQ: 554200 Вопросов: 101 Ответов: 343 |
Профиль | Цитата | #12 | Добавлено: 10.06.04 22:32 |
А ты пробовал загружать весь файл в память а потом уже искать кол-иво строк? |
Номер ответа: 13 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #13 | Добавлено: 10.06.04 22:49 |
А напиши себе DLL на РВ, там есть такие вещи :
![]() OPEN "d:\WIN32API.INC" FOR INPUT AS #1 FILESCAN #1, RECORDS TO count& ![]() ![]() LINE INPUT #1, TheData() TO y& CLOSE #1 и работать будет шибко быстро. WIN32API.INC я нарастил до более чем 400000 строк. Результ - менее секунды. И в count& сидит кол-во строк. А TheData() - массив, в котором все твои строки. |
Номер ответа: 14 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #14 | Добавлено: 10.06.04 22:51 |
Да, и размер файла WIN32API.INC - 17 Мб |
Номер ответа: 15 Автор ответа: ![]() ![]() ![]() Вопросов: 117 Ответов: 1538 |
Профиль | Цитата | #15 | Добавлено: 10.06.04 23:42 |
Я тут скомпилировал эту функцию в DLL, проверил из VB - работает. Пример: количество строк 437 042, время подсчёта строк - 0.09 сек. Если надо может тебе куда на мыло скинуть? |
Страница: 1 |
|