Форум программистов, компьютерный форум, киберфорум
Visual Basic
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.73/11: Рейтинг темы: голосов - 11, средняя оценка - 4.73
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232

Чтение последних 100 строк из текстового файла

04.06.2010, 17:43. Показов 2070. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Нужно реализоваться сабж.
Размеры файлов в пределах 40-100мб.
Прога должна через указанный промежуток времени открывать файл
и считывать оттуда 100 последних строк.
Что лучше использовать для этой цели?
API, FSO или Open?
И есть ли в FSO возможность позиционироваться на конец файла?
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
04.06.2010, 17:43
Ответы с готовыми решениями:

Быстрое чтение последних 100 строк файла
Здравствуйте, Есть такая проблема: нужно быстро прочесть 100 последних строк CSV-файла. Дело в том, что другое приложение постоянно пишет...

Распечатайте 15 последних строк текстового файла.
Дан большой текстовый файл с длиной строк не более 100 символов. Распечатайте 15 последних строк файла.

Чтение из файла пяти последних строк
Добрый вечер! Есть один модуль , который отвечает за ввод последних 5 результатов программы. (печатает , последние 5 строчек файла) ...

8
CatsTail
05.06.2010, 11:36
Интересная задачка... В FSO (насколько я знаю) нет средств прямого доступа. Я бы поступил так:
1. открыть файл как двоичный;
2. определить его реальную длину;
3. оператором SEEK стать на последние 50К файла;
4. прочитать их в память;
5. разбить на строки (по разделителю 0ah);
6. сто последних и есть то, что нужно.

Если это нужно делать на ASP, то придется писать ActiveX-Dll.
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
06.06.2010, 09:27  [ТС]
Вобщем как я понял просто использовать стандартные средства басика для работы с файлами.
А намного ли это медленее чем API? И вообще через API можно это реализовать или не стоит?
Если можно, поясни плиз подробнее про 0ah.. это шестнадцатеричное
vbNewLine или как?
0
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
06.06.2010, 10:29  [ТС]
И не могу догнать как выполнить пункт 4?
0
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
06.06.2010, 11:06  [ТС]
Как считать разобрался..
нужно было просто заранее буфер готовить для данных Space(...)
Так что вопрос снимается.
А искать 0ah только через цикл? Может тормоза будут?
0
CatsTail
08.06.2010, 00:36
Не будет тормозов. Я это регулярно делаю. В блоке размером 50К поиск выполняется практически мгновенно. Кстати, у меня выложена ActiveX-Dll (http://www.webcenter.ru/~abfaifel) для работы с текстовыми файлами, как с файлами прямого доступа. Там я составлял массив длин и смещений строк для текстоврого файла на 20МБ. На Р-133 (стареньком) это заняло ~ 10 сек.
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
08.06.2010, 10:33  [ТС]
Попробовал этот ActiveX. Хорошая штука для не очень больших файлов.
Но на моем примере (файл ~70МБ) открытие (чтение в память) происходит долго.
Все таки лучше в 50кб отыскивать строки.
Но у меня почему то не получается определять разделитель 0ah.
Как его отыскивать, можешь привети код?
Я делаю вот так: (мои эксперименты)
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
Private Sub Command1_Click()
Dim fn As String, fh As Integer, fl As Long
Dim sBuffer As String
Dim assumedBuffer As Long
Dim i As Long
Dim stringsCounter As Long
Dim LogStrings() As String
Dim prevCrLfPos As Long
 
 fh = FreeFile
 fn = 'D:vb_devel
eadfileaccess.log'
 fl = FileLen(fn)
 assumedBuffer = 32768
 sBuffer = Space(assumedBuffer)
 
 Open fn For Binary Access Read As #fh
 Seek #fh, (fl - assumedBuffer)
 
 Get #fh, , sBuffer
 Close #fh
 
DoEvents
 
Screen.MousePointer = vbHourglass
stringsCounter = 0
prevCrLfPos = Len(sBuffer)
 
For i = Len(sBuffer) To 1 Step -1
 If Mid(sBuffer, i, 2) = vbNewLine Then
  stringsCounter = stringsCounter + 1
  ReDim Preserve LogStrings(stringsCounter)
  LogStrings(stringsCounter) = Mid(sBuffer, i + 2, 100)
  'prevCrLfPos = Len(sBuffer) - i
 End If
Next i
 
For i = 1 To 100
 Me.List1.AddItem LogStrings(i)
Next i
 
Screen.MousePointer = vbNormal
End Sub
0
CatsTail
09.06.2010, 00:31
Конечно, перебирать символ за символом в поиске разделителя - неэффективно. Вот более эффективный код:
Visual Basic
1
2
3
4
5
6
7
8
    k&=1
    Do
       p&=Instr(k&,Buf,chr$(10))
       if (p&=0) Then Exit Do  ' блок исчерпан 
       '::: Очередная строка занимает байты от (k&+1) - го до
       '::: (p-1) - го. В p-м байте разделитель.     
       k&=p&+1 
    Loop
1 / 1 / 0
Регистрация: 25.05.2008
Сообщений: 232
09.06.2010, 10:21  [ТС]
спасибо, вроде разобрался
побыстрей стало бегать!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
09.06.2010, 10:21
Помогаю со студенческими работами здесь

Чтение строк из текстового файла
Помогите с кодом! Имеется текстовый файл, в к-ом построчно идут вопрос, 4 варианта ответов, следующий вопрос, 4 варианты ответов и т.д....

Чтение и анализирование строк из текстового файла
Делаю программу, нужна помощь. Суть программы в том, что она в текстовом файле, где в строке написано Имя, Пол и Рост, искала Мужчину с...

Чтение первых 10-и строк из текстового файла
Доброго времени суток. В папке "Documents" (документы) есть папка с названием "wasd", а в папке файл, в котором нужно прочитать первые 10...

Чтение строк из текстового файла в memo
Привет. Как сделать чтобы при чтении строк из файла такого вида: 123 456,78 789 12,5 987 654 321 98,8 они записывались в memo...

Чтение информации из текстового файла в массив строк.
Считать из текстового файла информацию в массив строк. Отобразить на экран. Удалить повторяющиеся слова. Отобразить на экран. Переписать...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
Автозаполнение реквизита при выборе элемента справочника
Maks 27.03.2026
Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. При выборе "Спецтехники" (Тип Справочник. Спецтехника), заполняется. . .
Сумматор с применением элементов трёх состояний.
Hrethgir 26.03.2026
Тут. https:/ / fips. ru/ EGD/ ab3c85c8-836d-4866-871b-c2f0c5d77fbc Первый документ красиво выглядит, но без схемы. Это конечно не даёт никаких плюсов автору, но тем не менее. . . всё может быть. . .
Автозаполнение реквизитов при создании документа
Maks 26.03.2026
Программный код из решения ниже размещается в модуле объекта документа, в процедуре "ПриСозданииНаСервере". Алгоритм проверки заполнения реализован для исключения перезаписи значения реквизита,. . .
Команды формы и диалоговое окно
Maks 26.03.2026
1. Команда формы "ЗаполнитьЗапчасти". Программный код из решения ниже на примере нетипового документа "ЗаявкаНаРемонтСпецтехники" разработанного в конфигурации КА2. В качестве источника данных. . .
Кому нужен AOT?
DevAlt 26.03.2026
Решил сделать простой ланчер Написал заготовку: dotnet new console --aot -o UrlHandler var items = args. Split(":"); var tag = items; var id = items; var executable = args;. . .
Отправка уведомления на почту при создании или изменении элементов справочника
Maks 24.03.2026
Программная отправка письма электронной почты на примере типового справочника "Склады" в конфигурации БП3. Перед реализацией необходимо выполнить настройку системной учетной записи электронной. . .
модель ЗдравоСохранения 5. Меньше увольнений- больше дохода!
anaschu 24.03.2026
Теперь система здравосохранения уменьшает количество увольнений. 9TO2GP2bpX4 a42b81fb172ffc12ca589c7898261ccb/ https:/ / rutube. ru/ video/ a42b81fb172ffc12ca589c7898261ccb/ Слева синяя линия -. . .
Midnight Chicago Blues
kumehtar 24.03.2026
Такой Midnight Chicago Blues, знаешь?. . Когда вечерние улицы становятся ночными, а ты не можешь уснуть. Ты идёшь в любимый старый бар, и бармен наливает тебе виски. Ты смотришь на пролетающие. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru