On-line: Haz, tnsr2, гостей 2. Всего: 4 [подробнее..]
АвторСообщение



Пост N: 70
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 03.07.07 13:33. Заголовок: Чтение строк из файла


Вот такой, вроде как простой, вопрос, но ответа не нашёл. Есть ли в Клиппере или Харборе функция, которая читает строки (по одной) из файла? (Строки - куски текста, заканчивающиеся CRLF или LF). Где-то я встречал утверждение, что не надо делать свою буферизацию, на самом деле - надо. Если читать из файла побайтно, получается страшно долго. Я в своё время написал функцию, которая читает с буферизацией, но почему-то работает всё равно медленно:при маленьких файлах незаметно, при больших - читает намного медленнее, чем dbf такого же размера (это можно понять, записи одинаковой длины), но - в этом же самом файле любой редактор ищет намного быстрее. Есть ли что-нибудь стандартное? Кто знает? Ведь задача-то типичная.


Спасибо: 0 
ПрофильЦитата Ответить
Ответов - 36 , стр: 1 2 All [только новые]


постоянный участник


Пост N: 323
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.07.07 14:33. Заголовок: Re:


Первое, что приходит на ум - это если размер файла меньше 64К, то можно воспользоваться стандартной функцией MEMOREAD(), с помощью которой считать весь файл в переменную, а затем использовать MEMOLINE().

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 71
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 03.07.07 16:03. Заголовок: Re:


Спасибо, размер, правда, бывает больше 64К, но в Харборе вроде это ограничение снято. А ведь Memoline() требует указания длины строки, и только благодаря этому работает быстро. Попробовать что-то в таком роде можно, но я думал - вдруг есть что-то стандартное...

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 324
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.07.07 16:34. Заголовок: Re:


Где-то в Harbour я слышал про функцию ReadLine() или ReadLn().
Что касается MEMOLINE(), то длину строки нужно указать такую, которая превосходит максимальную длину строки, завершающуюся CR+LF. Максимальная длина строки в MEMOMINE() может быть равна 254 символа. Можно вообще обойтись без MEMOLINE(), а просто самому искать CR+LF с помощью функции AT().

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 730
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.07.07 17:06. Заголовок: Re:


Библиотека Nanfor - FT_FUSE + функции с этим связанные

Или средствами Clipper , см. пример
http://robson.fjaunet.com.br/fatec/clipper/aulas/pdf/aula_09.pdf

Функция FUNCTION IMP_TELA

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 72
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 03.07.07 17:26. Заголовок: Re:


IMP_TELA - это что-то совсем другое.
Но вот нашёл в примерах MiniGui (BUFFREAD.PRG) функцию BReadLine - на первый взгляд как у меня было. Надо попробовать - вдруг будет работать быстрее?

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 731
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 03.07.07 17:34. Заголовок: Re:


AM пишет:

 цитата:
IMP_TELA


IMP_TELA и сопутсвующие ей функции это экранный просмотр файла любой длины средствами Clipper ,
на ее основе я сделал свой просмотровщик.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 37
Зарегистрирован: 29.07.05
ссылка на сообщение  Отправлено: 04.07.07 08:56. Заголовок: Re: Чтение строк из файла


AM пишет:

 цитата:
Ведь задача-то типичная

Я что-то не понял? С клиппером идет огромная коллекция примеров, в том числе и на твою тему: CLIP52\SOURCE\TBROW\BROTEXT

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 73
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 04.07.07 09:16. Заголовок: Re:


Dima Спасибо, Дима, но в IMP_TELA ориентация на диалог с человеком, а значит ослаблены требования к скорости. К тому же много для меня лишнего, замучаешься вычленять.
les В том-то и дело, что пока не могу добиться приемлемой скорости.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 732
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.07.07 09:35. Заголовок: Re:


AM
Dima пишет:

 цитата:
Библиотека Nanfor - FT_FUSE + функции с этим связанные


Есть она у тебя или сказать где взять ?

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 38
Зарегистрирован: 29.07.05
ссылка на сообщение  Отправлено: 04.07.07 10:27. Заголовок: Re:


AM пишет:

 цитата:
В том-то и дело, что пока не могу добиться приемлемой скорости

А какой скорости ты хотел от данных с непредсказуемым размером записи? Откажись от текстового файла, пиши в dbf

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 733
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.07.07 10:46. Заголовок: Re:


les пишет:

 цитата:
А какой скорости ты хотел от данных с непредсказуемым размером записи? Откажись от текстового файла, пиши в dbf


Подозреваю что считывает он не свои файлы (текстовые) , например многие программы типа клиент-банк
выбрасывают инфу только в тексте.


Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 39
Зарегистрирован: 29.07.05
ссылка на сообщение  Отправлено: 04.07.07 11:20. Заголовок: Re:


А сколько времени длится обработка?
Offtopic: несколько лет назад я на скорую руку слепил отчет (налоговая сидела на плечах). Он выполнялся минут 10:( Потом по свободе оптимизировал до 1 минуты. Мои бухи очень обиделись - некогда кофе попить;)

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 74
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 04.07.07 12:00. Заголовок: Re:


Dima пишет:

 цитата:
Есть она у тебя или сказать где взять ?


Нету, подскажи!
Dima пишет:

 цитата:
Подозреваю что считывает он не свои файлы (текстовые)


Так и есть, т.е. от меня не зависит.
les пишет:

 цитата:
А сколько времени длится обработка?


Примерно 1000-10000 строк/мин. Т.е. медленно. А ведь читаются последовательно.




Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 734
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.07.07 12:14. Заголовок: Re:


AM пишет:

 цитата:
Примерно 1000-10000 строк/мин. Т.е. медленно


Медленновато однако......
Nanfor можно взять тут
http://www.blinkinc.com/techsupp.htm
CA-Clipper 5.x / NT / Windows 95 / CPU timeslice release
http://www.blinkinc.com/dl/misc/nfkit.zip

Спасибо: 0 
ПрофильЦитата Ответить





Пост N: 14
Зарегистрирован: 17.10.05
ссылка на сообщение  Отправлено: 04.07.07 13:10. Заголовок: Re:


самый простой, примитивный и в то же время эффективный способ -
создать дбф с одним полем С максимально ожидаемой длины строки,
сделать в него append from ... SDF
и наслаждаться жизнью. проверено.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 75
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 04.07.07 16:05. Заголовок: Re:


Dima Извини, Дима, боюсь, что не подойдёт. Мне-то надо для Харбора. Товарищи могут спросить "Так что ж ты мозги пудришь?" Но я думал, что при наличии исходников это не важно. А здесь нужных исходников не нашёл.

LYSK Можно попробовать и так, ускорение здесь, видимо, за счёт внутренней оптимизации (т.е. алгоритм, который не может быть реализован на Клиппере). Правда, хотелось бы самому управлять каждой записью (хотя бы чтобы их считать, кроме того, хочу для контроля добавлять в dbf ссылку на txt-файл и строку, в общем, задача у меня нестандартная). Вообще, наверно, критические вещи лучше написать на С, когда-нибудь я к этому приду.

В принципе низкая скорость - не так уж и страшно, если бы это надо было проделывать один раз. А при отладке
всего этого может быть много раз, и не всегда можно играть на обрезанных файлах.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 325
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 04.07.07 16:41. Заголовок: Re:


MEMOREAD() и есть такое ускорение, так как весь файл целиком читается в память, а обработака отдельных записей уже происходит в памяти. Проблема только в том, что размер файла ограничен максимальным размером сроки в Clipper, то есть 0FFDCh (если мне память не изменяет). Но можно самому проделать это с помощью функций FOPEN() и различных клонов FREAD(). Просто выделяете строку максимального размера и в нее считываете последовательно файл пока не достигнете его конца. Внутри этой строки-буфера ищете последовательно комбинации CR+LF. Когда достигнут конец строки-буфера, его "кончик" переписываете в другую переменную и снова считываете всюстроку-буфер. А "кончик" соединяете с началом буфера до первого нахождения CR+LF.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост 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
*/



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 76
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 04.07.07 17:04. Заголовок: Re:


Григорьев Владимир
В общем, у меня так и было, только буфер я делал размером с кластер, и строк в него помещалось сколько Бог на душу положит. Почему-то получалось медленно! (хотя заметно это стало на больших файлах, файлы типа конфигураций читались нормально).


Спасибо: 0 
ПрофильЦитата Ответить



Не зарегистрирован
Зарегистрирован: 01.01.70
ссылка на сообщение  Отправлено: 05.07.07 13:35. Заголовок: Слушаете свою любимую песню "Валянки, валянки..."


Хи-хи-хи. Дела давно забытых дней...
Была библиотека в Clippere - WildSeek function Пользовался ею. Для КАВО ее разновидность здесь:

http://www.yi.com/prany/cavo/cavofront.htm

Если на разберетесь, ищите для Клиппера. Использует fread().

А, вот и она на Оазисе:
Look on my www site for wildseek.zip

--
Phil Barnett mailto:midnight @ the-oasis.net
Oasis WWW http://www.the-oasis.net
FTP Site ftp://ftp.iag.net/pub/clipper
Clipper FAQ http://www.the-oasis.net/clipper.html
Harbour Project http://www.Harbour-Project.org

Reality is the leading cause of stress
among those who are in touch with it.

Слушаете свою любимую песню "Валянки, валянки..."


Спасибо: 0 
Цитата Ответить



Пост N: 2
Зарегистрирован: 09.11.06
ссылка на сообщение  Отправлено: 05.07.07 13:36. Заголовок: fgerger


ewferg

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 77
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 06.07.07 14:05. Заголовок: Re:


Спасибо всем за помощь!

Dima
Понравился набор функций hb_f*(), пригодится не только hb_freadln(), но и другие. Но одно плохо: как разделитель понимает только CRLF, а просто LF - нет. А такие файлы бывают.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 182
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 06.07.07 14:52. Заголовок: Re:


AM пишет:

 цитата:
Но одно плохо: как разделитель понимает только CRLF, а просто LF - нет.



CRLF или LFCR

Но ведь мы имеем дело с открытым кодом, поменял конструкции типа

if ( ((*(b + x) == 13) && (*(b + x + 1) == 10)) || ((*(b + x) == 10) && (*(b + x + 1) == 13)) || (*(b + x) == 26) || ( x >= (int)read) )

на
if ( ((*(b + x) == 10 ) || (*(b + x) == 26) || ( x >= (int) read) )
или что-нибудь в этом роде и опять радуешься жизни




Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 78
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 06.07.07 16:22. Заголовок: Re:


А где взять? Сама библиотека есть, исходников нет. Поискал - не нашёл.


Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 736
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 06.07.07 16:57. Заголовок: Re:


AM пишет:

 цитата:
А где взять? Сама библиотека есть, исходников нет.


у меня тут лежит
C:\CVS\xharbour\source\misc\hb_f.c

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 79
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 06.07.07 17:20. Заголовок: Re:


Да, нашёл. Сначала файл (он завалялся в другом месте). А до этого не нашёл, т.к. искал только где положено.
Спасибо.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 1
Зарегистрирован: 10.07.07
ссылка на сообщение  Отправлено: 10.07.07 12:43. Заголовок: Re:


AM пишет:

 цитата:
Вот такой, вроде как простой, вопрос, но ответа не нашёл. Есть ли в Клиппере или Харборе функция, которая читает строки (по одной) из файла?



а в чем проблема - 10 строк написать?

AM пишет:


 цитата:
Если читать из файла побайтно



попробуй читать по 2 байта зараз. Будет в 2 раза быстрей

Dima!!! задолбал меня форум, постоянно на пароль ругается!!!! то он с ником совпадает, то не подходит!!!!! Уже седьмой ник завел! Удали пользователя suv.... suv6 я зарегистрирую снова suv

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 80
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 10.07.07 13:29. Заголовок: Re:


suv7
Да уже всё, проехали.

Петр Нет, малость посложней получилось

if ( ((*(b + x) == 13) && (*(b + x + 1) == 10)) ||
(*(b + x) == 26) || ( x >= (int)read) )
break;
else if (*(b + x) == 10) {
if ( (*(b + x+1) != 13) && (x>0) ) x--;
break;
}

А если в конце chr(13)+chr(10)+chr(26), то напоследок выдаёт пустую строку. Может, так и д.б., это не очень важно.

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 2
Зарегистрирован: 31.03.07
ссылка на сообщение  Отправлено: 12.07.07 09:51. Заголовок: Re:


Много лет назад я написал целую библиотеку функций которые использовали текстовый файл как массив. На сколько я помню в основе лежали готовые функции из библиотеки CTools-3 (кажется так называлась)
Сейчас пытаюсь перевеси свои программы на xHarbour, но к сожалению не смотря на поддержку этой библиотеки функции не работают. По всей видимости поддержка CTools не полная.


Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 183
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 12.07.07 11:59. Заголовок: Re:


Uncle_ed пишет:

 цитата:
Петр Нет, малость посложней получилось



Я же писал что-нибудь в этом роде.

В оригинале (см. выше) функция обрабатывает CRLF и LFCR

if ( ((*(b + x) == 13) && (*(b + x + 1) == 10)) ||
((*(b + x) == 10) && (*(b + x + 1) == 13)) ||
(*(b + x) == 26) || ( x >= (int)read) ) {
break;

Если тебе просто надо обработать еще LF, т.е. можно просто добавить ИЛИ LF

if ( ((*(b + x) == 13) && (*(b + x + 1) == 10)) ||
((*(b + x) == 10) && (*(b + x + 1) == 13)) ||
(*(b + x) == 10)) || (*(b + x) == 26) || ( x >= (int)read) ) {
break;

Если ты не хочешь обрабатывать LFCR выбрось ((*(b + x) == 10) && (*(b + x + 1) == 13))

Определись какие разделители ты хочешь использовать.
Если только CRLF и LF, то зачем делать лишнюю проверку if ( (*(b + x+1) != 13) ?
И какой смысл ты вкладываешь в x-- ?



Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 82
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 12.07.07 13:28. Заголовок: Re:


Петр пишет:

 цитата:
((*(b + x) == 10) && (*(b + x + 1) == 13)) ||
(*(b + x) == 10))


Так получается тавтология. Лучше просто убрать && (*(b + x + 1) == 13))
На самом деле на практике у меня встречаются файлы с CRLF и с LF. И, естественно, надо, чтобы работало и с тем и с другим без подсказок человека. LFCR пока не было, но кто знает?

Твой пример (только разобраться со скобками) правильно работает вроде бы на всех комбинациях!
Но только если в функции hb_hbfskip() исправлено по-моему. Т.е. надо проверить, лишние действия и правда могут быть.






Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 83
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 12.07.07 15:16. Заголовок: Re:


Я не совсем по-русски изложил свои мысли. Для правильной работы я изменил hb_hbfskip(), и для однообразия так же изменил и hb_freadln(), и прочие. Но, видимо, эти лишнее, хотя и работает. Вообще-то методом тыка, глубоко я не копал. А есть же ещё hb_ReadAndSkip(), можно будет попробовать.

Спасибо: 0 
ПрофильЦитата Ответить
постоянный участник


Пост N: 184
Зарегистрирован: 09.10.06
ссылка на сообщение  Отправлено: 13.07.07 08:34. Заголовок: Re:


AM пишет:

 цитата:
Так получается тавтология.



Где ты ее увидел?
Это нормальный код, который работает с CRLF, LFCR и LF.

Изменения в других функциях (той же hb_fskip() ) нужны, причем обязательно.

Для увеличения быстроты можно еще поиграться с
#define b_size 4096
#define c_size 4096




Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 84
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 13.07.07 09:44. Заголовок: Re:


Петр пишет:

 цитата:
Где ты ее увидел?


Ну как же, вспомни булеву алгебру:
x | x&y = x (потому что x= x&y | x&^y)

Спасибо: 0 
ПрофильЦитата Ответить



Пост N: 118
Зарегистрирован: 15.12.06
ссылка на сообщение  Отправлено: 16.11.11 16:33. Заголовок: Приходится поднимать..


Приходится поднимать старую тему. В новых версиях MiniGui нет исходников hbmisc.lib ?
Дело в том, что её функции (hb_fReadLn) так и не работают с только LF в качестве конца строки. А файлы такие продолжают встречаться. Если же вставить отдельные функции в программу (в .prg или .c), в доработанном виде (как выше в теме, и как ранее работало - т.е. по большому счёту, как было в misc.lib), то происходит вылет (спрашивает, сообщать в MS об ошибке или нет). Можно где-то увидеть новые исходники, чтобы понять, как надо ещё доработать?

P.S. Хотя, наверно, надо новую тему, в раздел GUI. Прошу модераторов перенести, если возможно.

Спасибо: 0 
ПрофильЦитата Ответить
администратор




Пост N: 2196
Зарегистрирован: 17.05.05
ссылка на сообщение  Отправлено: 16.11.11 17:16. Заголовок: AM пишет: В новых в..


AM пишет:

 цитата:
В новых версиях MiniGui нет исходников hbmisc.lib


Не там исходники ищешь , смотри сырцы (x)Harbour

Спасибо: 1 
ПрофильЦитата Ответить
Ответов - 36 , стр: 1 2 All [только новые]
Ответ:
1 2 3 4 5 6 7 8 9
большой шрифт малый шрифт надстрочный подстрочный заголовок большой заголовок видео с youtube.com картинка из интернета картинка с компьютера ссылка файл с компьютера русская клавиатура транслитератор  цитата  кавычки моноширинный шрифт моноширинный шрифт горизонтальная линия отступ точка LI бегущая строка оффтопик свернутый текст

показывать это сообщение только модераторам
не делать ссылки активными
Имя, пароль:      зарегистрироваться    
Тему читают:
- участник сейчас на форуме
- участник вне форума
Все даты в формате GMT  3 час. Хитов сегодня: 139
Права: смайлы да, картинки да, шрифты да, голосования нет
аватары да, автозамена ссылок вкл, премодерация откл, правка нет