Страница: 1 | 2 |
Вопрос: Определение числа строк в текстовом файле
Добавлено: 03.05.07 16:02
Автор вопроса: Last | ICQ: 480-791-781
Ответы
Всего ответов: 29
Номер ответа: 16
Автор ответа:
intel-DX
ICQ: 445091742
Вопросов: 4
Ответов: 169
Профиль | | #16
Добавлено: 03.05.07 19:31
Нее это не плагиат. Пока написал код, пока проверил что LOF(1) = Len(Input(LOF(1), #1)) и отправил, то пришли Ваши сообщения
Номер ответа: 17
Автор ответа:
Серёга
ICQ: 262809473
Вопросов: 17
Ответов: 561
Web-сайт:
Профиль | | #17
Добавлено: 03.05.07 20:27
Всё немного проще:
MsgBox StringCount("c:\1.txt"
End Sub
Private Function StringCount(FName As String)
Dim f As Integer, t As String
f = FreeFile
Open FName For Input As f: t = Input(LOF(f), f): Close f
StringCount = UBound(Split(t, vbCrLf)) + 1
End Function
Номер ответа: 18
Автор ответа:
intel-DX
ICQ: 445091742
Вопросов: 4
Ответов: 169
Профиль | | #18
Добавлено: 03.05.07 20:53
Всё немного проще:
Private Sub Form_Load()...
2 Серёга кому как?
Номер ответа: 19
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #19
Добавлено: 03.05.07 23:43
Private Function StringCount(ByVal FName As String) as Long
'Dim f As Integer
Dim f As Byte
'Open FName For Input As f
Open FName For Binary As f
't = Input(LOF(f), f)
t = space$(Lof(f))
Get #f, ,t
'а потом уже
StringCount = UBound(Split(t, vbCrLf)) + 1
хотя если в файле небудет неодного vbCrLf, то это вылетит в ошибку, поэтому стоит тогда так что-ли..
on error goto e
StringCount = UBound(Split(t, vbCrLf)) + 1
exit function
e:
StringCount = 1
End Sub
Хотя делить строку на массив довольно трудоемко, почему бы не посчитать кол-во vbCrLf в строке самому ручками?
Dim AllTxt$: AllTxt$ = "1" & vbCrLf & "2" & vbCrLf & "3"
Dim pos As Long, count As Long, i As Long
For i = 1 To Len(AllTxt)
pos = InStr(i, AllTxt, vbNewLine, 3)
If pos = 0 Then Exit For
count = count + 1
i = pos
Next i
MsgBox count
End Sub
Это должно быть быстрее...
Номер ответа: 20
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #20
Добавлено: 04.05.07 14:53
Посмотри мой пост, где файл побайтно читается
И вообще весь файл в память грузить - заведомо глюкаво. Т.к. по законам Мерфи размер обрабатываемого файла стремится к бесконечности
Если уж хотите производительности от прогаммы, то надо даже не побайтно считывать файл и проверять на vbCrLf, а считывать его блоками (допустим по 4096 байт)
А с массивом это вообще ужос (имхо, кому как)
Номер ответа: 21
Автор ответа:
Серёга
ICQ: 262809473
Вопросов: 17
Ответов: 561
Web-сайт:
Профиль | | #21
Добавлено: 04.05.07 16:39
2 HACKER
Private Function StringCount(ByVal FName As String) as Long
- согласен, но это мелочи
Dim f As Byte
- отвечу цитатой из справочника:
FreeFile([RangeNumber])
Функция FreeFile используется для возвращения незанятого номера(не задействованного для открытия другого файла) файла, который можно использовать при открытии файла инструкцией Open. Рекомендуется всегда использовать эту функцию при открытии файла во избежание различных проблем
Возвращаемое значение
Возвращает значение типа Integer в диапазоне от 1 до 511, представляющее следующий номер файла, доступный для использования с инструкцией Open
Open FName For Binary As f
't = Input(LOF(f), f)
t = space$(Lof(f))
Get #f, ,t
- это уж кому как больше нравится
- неправда
Функция Split(Expression) возвращает одномерный массив с типом данных Variant(String), содержащий в качестве элементов найденные субстроки
Параметры
Expression
Обязательный аргумент - строка, которую нужно расщепить. Если аргумент содержит нулевую строку("", то возвращается пустой массив, т.е. массив без элементов и данных
Delimiter
Необязательный аргумент - символы типа String, которые используются в качестве разделителя строки. Если аргумент опущен, то по умолчанию используется символ пробела(" ". Если же аргумент содержит нулевую строку("", то возвращается одноэлементный массив, содержащее целую строку
Код рабочий. Я проверял и со строками и с одной строкой и с пустым файлом.
Номер ответа: 22
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #22
Добавлено: 04.05.07 18:29
А если vbCrLf попадет на границе двух блоков?
Номер ответа: 23
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #23
Добавлено: 04.05.07 18:48
Ну тогда надо проверять не на vbCrLf, а на vbCr или vbLf
Номер ответа: 24
Автор ответа:
Artyom
Разработчик
Вопросов: 130
Ответов: 6602
Профиль | | #24
Добавлено: 04.05.07 19:14
А если идет:
Cr
Cr
Lf
Cr
Cr
Lf
Lf
Lf
Lf
Cr
?
Номер ответа: 25
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #25
Добавлено: 04.05.07 19:24
Просто нужно хранить, являлся ли последний символ предыдущего блока vbCr
Номер ответа: 26
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #26
Добавлено: 04.05.07 20:15
странно, но у меня в каком-сто справочнике написано что FreeFile именно Byte возвращает, и файлов открытых одновременно неможет быть больше 255 :\
Номер ответа: 27
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #27
Добавлено: 04.05.07 23:24
2 Sharp, не вижу проблемы. Если уж символ(ы) переноса настолько в файле не определены, то нужно считать и vbCr и vbLf
Или да, у меня тоже мысль была, если всетаки разделитель известен (vbCrLf), то нужно не только искать в блоке vbCrLf, но и проверять что в конце предыдущего и в начале текущего блока.
Номер ответа: 28
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #28
Добавлено: 04.05.07 23:31
Я тоже не вижу проблемы в том, чтобы хранить, являлся ли последний символ предыдущего блока vbCr
Номер ответа: 29
Автор ответа:
ZagZag
ICQ: 295002202
Вопросов: 87
Ответов: 1684
Профиль | | #29
Добавлено: 05.05.07 00:52
Ой, сорри, первая строка 2 Brand