Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 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-сайт: houselab.narod.ru
 Профиль | | #17
Добавлено: 03.05.07 20:27
Всё немного проще:
Private Sub Form_Load()
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(FName As String)
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 в строке самому ручками?

Private Sub Form_Load()

    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 в строке самому ручками?

Посмотри мой пост, где файл побайтно читается

И вообще весь файл в память грузить - заведомо глюкаво. Т.к. по законам Мерфи размер обрабатываемого файла стремится к бесконечности =)
Если уж хотите производительности от прогаммы, то надо даже не побайтно считывать файл и проверять на vbCrLf, а считывать его блоками (допустим по 4096 байт)
А с массивом это вообще ужос =) (имхо, кому как)

Ответить

Номер ответа: 21
Автор ответа:
 Серёга



ICQ: 262809473 

Вопросов: 17
Ответов: 561
 Web-сайт: houselab.narod.ru
 Профиль | | #21
Добавлено: 04.05.07 16:39
2 HACKER
'Private Function StringCount(FName As String)
Private Function StringCount(ByVal FName As String) as Long

- согласен, но это мелочи :)

'Dim f As Integer
Dim f As Byte

- отвечу цитатой из справочника:
Функция FreeFile
FreeFile([RangeNumber])
Функция FreeFile используется для возвращения незанятого номера(не задействованного для открытия другого файла) файла, который можно использовать при открытии файла инструкцией Open. Рекомендуется всегда использовать эту функцию при открытии файла во избежание различных проблем

Возвращаемое значение
Возвращает значение типа Integer в диапазоне от 1 до 511, представляющее следующий номер файла, доступный для использования с инструкцией Open


'Open FName For Input As f
Open FName For Binary As f

't = Input(LOF(f), f)
t = space$(Lof(f))
Get #f, ,t

- это уж кому как больше нравится

хотя если в файле небудет неодного vbCrLf, то это вылетит в ошибку

- неправда
Split(Expression,[Delimiter],[Limit],[Compare] )
Функция Split(Expression) возвращает одномерный массив с типом данных Variant(String), содержащий в качестве элементов найденные субстроки

Параметры
Expression
Обязательный аргумент - строка, которую нужно расщепить. Если аргумент содержит нулевую строку("";), то возвращается пустой массив, т.е. массив без элементов и данных
Delimiter
Необязательный аргумент - символы типа String, которые используются в качестве разделителя строки. Если аргумент опущен, то по умолчанию используется символ пробела(" ";). Если же аргумент содержит нулевую строку("";), то возвращается одноэлементный массив, содержащее целую строку


Код рабочий. Я проверял и со строками и с одной строкой и с пустым файлом.

Ответить

Номер ответа: 22
Автор ответа:
 Artyom



Разработчик

Вопросов: 130
Ответов: 6602
 Профиль | | #22 Добавлено: 04.05.07 18:29
Если уж хотите производительности от прогаммы, то надо даже не побайтно считывать файл и проверять на vbCrLf, а считывать его блоками (допустим по 4096 байт)

А если vbCrLf попадет на границе двух блоков?

Ответить

Номер ответа: 23
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #23 Добавлено: 04.05.07 18:48
А если vbCrLf попадет на границе двух блоков?

Ну тогда надо проверять не на 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-сайт: sharpc.livejournal.com
 Профиль | | #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-сайт: sharpc.livejournal.com
 Профиль | | #28
Добавлено: 04.05.07 23:31
Я тоже не вижу проблемы в том, чтобы хранить, являлся ли последний символ предыдущего блока vbCr

Ответить

Номер ответа: 29
Автор ответа:
 ZagZag



ICQ: 295002202 

Вопросов: 87
Ответов: 1684
 Профиль | | #29 Добавлено: 05.05.07 00:52
Ой, сорри, первая строка 2 Brand =)
2 Sharp, не вижу проблемы. Если уж символ(ы) переноса настолько в файле не определены, то нужно считать и vbCr и vbLf


Ответить

Страница: 1 | 2 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам