Автор | Сообщение |
|
| |
Пост N: 70
Зарегистрирован: 15.12.06
|
|
Отправлено: 03.07.07 13:33. Заголовок: Чтение строк из файла
Вот такой, вроде как простой, вопрос, но ответа не нашёл. Есть ли в Клиппере или Харборе функция, которая читает строки (по одной) из файла? (Строки - куски текста, заканчивающиеся CRLF или LF). Где-то я встречал утверждение, что не надо делать свою буферизацию, на самом деле - надо. Если читать из файла побайтно, получается страшно долго. Я в своё время написал функцию, которая читает с буферизацией, но почему-то работает всё равно медленно:при маленьких файлах незаметно, при больших - читает намного медленнее, чем dbf такого же размера (это можно понять, записи одинаковой длины), но - в этом же самом файле любой редактор ищет намного быстрее. Есть ли что-нибудь стандартное? Кто знает? Ведь задача-то типичная.
|
|
|
Ответов - 36
, стр:
1
2
All
[только новые]
|
|
|
| постоянный участник
|
Пост N: 323
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.07.07 14:33. Заголовок: Re:
Первое, что приходит на ум - это если размер файла меньше 64К, то можно воспользоваться стандартной функцией MEMOREAD(), с помощью которой считать весь файл в переменную, а затем использовать MEMOLINE().
|
|
|
|
| |
Пост N: 71
Зарегистрирован: 15.12.06
|
|
Отправлено: 03.07.07 16:03. Заголовок: Re:
Спасибо, размер, правда, бывает больше 64К, но в Харборе вроде это ограничение снято. А ведь Memoline() требует указания длины строки, и только благодаря этому работает быстро. Попробовать что-то в таком роде можно, но я думал - вдруг есть что-то стандартное...
|
|
|
|
| постоянный участник
|
Пост N: 324
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.07.07 16:34. Заголовок: Re:
Где-то в Harbour я слышал про функцию ReadLine() или ReadLn(). Что касается MEMOLINE(), то длину строки нужно указать такую, которая превосходит максимальную длину строки, завершающуюся CR+LF. Максимальная длина строки в MEMOMINE() может быть равна 254 символа. Можно вообще обойтись без MEMOLINE(), а просто самому искать CR+LF с помощью функции AT().
|
|
|
|
| |
Пост N: 730
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.07.07 17:06. Заголовок: Re:
|
|
|
|
| |
Пост N: 72
Зарегистрирован: 15.12.06
|
|
Отправлено: 03.07.07 17:26. Заголовок: Re:
IMP_TELA - это что-то совсем другое. Но вот нашёл в примерах MiniGui (BUFFREAD.PRG) функцию BReadLine - на первый взгляд как у меня было. Надо попробовать - вдруг будет работать быстрее?
|
|
|
|
| |
Пост N: 731
Зарегистрирован: 17.05.05
|
|
Отправлено: 03.07.07 17:34. Заголовок: Re:
AM пишет: IMP_TELA и сопутсвующие ей функции это экранный просмотр файла любой длины средствами Clipper , на ее основе я сделал свой просмотровщик.
|
|
|
|
| |
Пост N: 37
Зарегистрирован: 29.07.05
|
|
Отправлено: 04.07.07 08:56. Заголовок: Re: Чтение строк из файла
AM пишет: Я что-то не понял? С клиппером идет огромная коллекция примеров, в том числе и на твою тему: CLIP52\SOURCE\TBROW\BROTEXT
|
|
|
|
| |
Пост N: 73
Зарегистрирован: 15.12.06
|
|
Отправлено: 04.07.07 09:16. Заголовок: Re:
Dima Спасибо, Дима, но в IMP_TELA ориентация на диалог с человеком, а значит ослаблены требования к скорости. К тому же много для меня лишнего, замучаешься вычленять. les В том-то и дело, что пока не могу добиться приемлемой скорости.
|
|
|
|
| |
Пост N: 732
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.07.07 09:35. Заголовок: Re:
AM Dima пишет: цитата: | Библиотека Nanfor - FT_FUSE + функции с этим связанные |
| Есть она у тебя или сказать где взять ?
|
|
|
|
| |
Пост N: 38
Зарегистрирован: 29.07.05
|
|
Отправлено: 04.07.07 10:27. Заголовок: Re:
AM пишет: цитата: | В том-то и дело, что пока не могу добиться приемлемой скорости |
|
А какой скорости ты хотел от данных с непредсказуемым размером записи? Откажись от текстового файла, пиши в dbf
|
|
|
|
| |
Пост N: 733
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.07.07 10:46. Заголовок: Re:
les пишет: цитата: | А какой скорости ты хотел от данных с непредсказуемым размером записи? Откажись от текстового файла, пиши в dbf |
| Подозреваю что считывает он не свои файлы (текстовые) , например многие программы типа клиент-банк выбрасывают инфу только в тексте.
|
|
|
|
|
| |
Пост N: 39
Зарегистрирован: 29.07.05
|
|
Отправлено: 04.07.07 11:20. Заголовок: Re:
А сколько времени длится обработка? Offtopic: несколько лет назад я на скорую руку слепил отчет (налоговая сидела на плечах). Он выполнялся минут 10:( Потом по свободе оптимизировал до 1 минуты. Мои бухи очень обиделись - некогда кофе попить;)
|
|
|
|
| |
Пост N: 74
Зарегистрирован: 15.12.06
|
|
Отправлено: 04.07.07 12:00. Заголовок: Re:
Dima пишет: цитата: | Есть она у тебя или сказать где взять ? |
| Нету, подскажи! Dima пишет: цитата: | Подозреваю что считывает он не свои файлы (текстовые) |
| Так и есть, т.е. от меня не зависит. les пишет: цитата: | А сколько времени длится обработка? |
| Примерно 1000-10000 строк/мин. Т.е. медленно. А ведь читаются последовательно.
|
|
|
|
| |
Пост N: 734
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.07.07 12:14. Заголовок: Re:
|
|
|
|
| |
Пост N: 14
Зарегистрирован: 17.10.05
|
|
Отправлено: 04.07.07 13:10. Заголовок: Re:
самый простой, примитивный и в то же время эффективный способ - создать дбф с одним полем С максимально ожидаемой длины строки, сделать в него append from ... SDF и наслаждаться жизнью. проверено.
|
|
|
|
| |
Пост N: 75
Зарегистрирован: 15.12.06
|
|
Отправлено: 04.07.07 16:05. Заголовок: Re:
Dima Извини, Дима, боюсь, что не подойдёт. Мне-то надо для Харбора. Товарищи могут спросить "Так что ж ты мозги пудришь?" Но я думал, что при наличии исходников это не важно. А здесь нужных исходников не нашёл. LYSK Можно попробовать и так, ускорение здесь, видимо, за счёт внутренней оптимизации (т.е. алгоритм, который не может быть реализован на Клиппере). Правда, хотелось бы самому управлять каждой записью (хотя бы чтобы их считать, кроме того, хочу для контроля добавлять в dbf ссылку на txt-файл и строку, в общем, задача у меня нестандартная). Вообще, наверно, критические вещи лучше написать на С, когда-нибудь я к этому приду. В принципе низкая скорость - не так уж и страшно, если бы это надо было проделывать один раз. А при отладке всего этого может быть много раз, и не всегда можно играть на обрезанных файлах.
|
|
|
|
| постоянный участник
|
Пост N: 325
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.07.07 16:41. Заголовок: Re:
MEMOREAD() и есть такое ускорение, так как весь файл целиком читается в память, а обработака отдельных записей уже происходит в памяти. Проблема только в том, что размер файла ограничен максимальным размером сроки в Clipper, то есть 0FFDCh (если мне память не изменяет). Но можно самому проделать это с помощью функций FOPEN() и различных клонов FREAD(). Просто выделяете строку максимального размера и в нее считываете последовательно файл пока не достигнете его конца. Внутри этой строки-буфера ищете последовательно комбинации CR+LF. Когда достигнут конец строки-буфера, его "кончик" переписываете в другую переменную и снова считываете всюстроку-буфер. А "кончик" соединяете с началом буфера до первого нахождения CR+LF.
|
|
|
|
| |
Пост N: 735
Зарегистрирован: 17.05.05
|
|
Отправлено: 04.07.07 17:01. Заголовок: Re:
AM пишет: Да не вопрос ;) Библиотека Libmisc цитата: | /* test program for hb_f*() harbour clones for nanfor's ft_f*() inplementation of : * hb_fuse() * hb_fskip() * hb_feof() * hb_frecno() * hb_freadln() * hb_flastrec() * hb_fgoto() * hb_fgotop() * hb_fgobottom() tested with Borland 32bit only */ |
|
|
|
|
|
| |
Пост N: 76
Зарегистрирован: 15.12.06
|
|
Отправлено: 04.07.07 17:04. Заголовок: Re:
Григорьев Владимир В общем, у меня так и было, только буфер я делал размером с кластер, и строк в него помещалось сколько Бог на душу положит. Почему-то получалось медленно! (хотя заметно это стало на больших файлах, файлы типа конфигураций читались нормально).
|
|
|
|
| |
Не зарегистрирован
Зарегистрирован: 01.01.70
|
|
Отправлено: 05.07.07 13:35. Заголовок: Слушаете свою любимую песню "Валянки, валянки..."
|
|
|
Ответов - 36
, стр:
1
2
All
[только новые]
|
|