:: Visual Foxpro, Foxpro for DOS
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
leonid
никакой ошибки не будет, но occurs посчитает только те 0h0D, которые встретятся в первых 16 Мb.
Не совсем так.

В случае строки OCCURS() считает символы согласно документации, то есть все, а не только в первых 16Mb.
В вашем примере сама операция присвоения "обрежет" строку до 16Mb, поэтому и счет символов будет вестись только в них.
Если же создать строку, допустим в 100Mb, то OCCURS() посчитает символы для всей строки.

Taran
У ТС так и было, сначала в переменную.
Это дела не меняет - результат всё равно будет неверным для строк такой длины.

Один из возможных вариантов - получать строку из memo по частям (цикле). Но ТС хотел обойтись без циклов.

Вот так можно обойтись без циклов:
TEXT TO с TEXTMERGE NOSHOW
<<f1>>
ENDTEXT

Ещё способ:
COPY MEMO MemoFieldName TO FileName
с = FILETOSTR(FileName)

Но всё это не особенно надежно, так как никогда не знаешь, строку какой длины сможет "прожевать" твой комп в текущих условиях.
Вот у меня сейчас строка размером в 600Mb создалась без проблем, а для строки в 1000Mb выдалась ошибка "... not enough memory..."



Исправлено 6 раз(а). Последнее : akvvohinc, 06.02.23 22:41
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
В общем, в таком, например, варианте ваш пример валиться не будет, но работать такая конструкция будет достаточно долго:
SET SAFETY off
m.a=REPLICATE('1234',4000000) + CHR(13) +CHR(10)
STRTOFILE(m.a,"tmp.dat")
STRTOFILE(m.a,"tmp.dat",.t.)
m.b=FILETOSTR("tmp.dat")
ERASE ("tmp.dat")
CREATE CURSOR tmp (f1 m)
INSERT INTO tmp VALUES (m.b)
SELECT myoccurs() AS k_cr FROM tmp
FUNCTION myoccurs
COPY MEMO f1 TO sostavrab.txt
RETURN OCCURS(0h0D, FILETOSTR('sostavrab.txt'))

PS
А вообще, при таких размерах memo таблица и 100 записей "не выдержит" - лимит на 2Гб прекратит все мучения.



Исправлено 4 раз(а). Последнее : akvvohinc, 06.02.23 23:23
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
ABB

Сообщений: 149
Откуда: Санкт-Петербург
Дата регистрации: 21.10.2006
Новое - это хорошо забытое старое
forum.foxclub.ru
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Ничего из этого старого не забыто.

Для меня новостью стало то, что при обычном присвоении значения memo-поля строке, его значение "обрезается" до 16M, то есть такая "проблема" с memo есть всегда, а не только при использовании функций OCCURS() или, как в той теме, функции STRTOFILE().
Разница лишь в том, что строка при присвоении обрезается молча, без ошибки, но это ещё хуже.

А в целом здесь плохо то, что Фокс по-разному себя ведет для строковых переменных и memo-полей - не симметрично - то есть закинуть длинную строку в memo проблем нет, а сделать обратное без "извращений" не получится.
То же происходит и при работе с функциями - над длинными строками они работают (не знаю, правда, все ли?), а над memo вылезает ограничение.
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
glaz58

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Спасибо of63, это именно то, что мне нужно. Вместе с GETWORDCOUNT сразу вспомнился GETWORDNUM, и пара этих функций эффективно и просто решает мою проблему. Без всяких нейросетей. Для меня могу считать тему закрытой.



Исправлено 1 раз(а). Последнее : glaz58, 07.02.23 17:20
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
это именно то, что мне нужно. Вместе с GETWORDCOUNT сразу вспомнился GETWORDNUM, и пара этих функций эффективно и просто решает мою проблему.
Оригинальный финал.
Оказывается, несмотря на желание
Цитата:
"посчитать сколько символов CR в мемо-поле"
проблема была вовсе не в этом.
А две функции, работающие со словами, более эффективны для подсчета символов, чем одна, специально для этого предназначенная. Теперь, видимо, придется все свои проги проверять на предмет повышения их эффективности парой этих функций.

Но всё же хотелось бы знать, какую проблему надо было решить на самом деле?
Исходя из написанного выше, могу предположить, что ALINES() была бы ещё эффективнее, чем та пара функций.



Исправлено 1 раз(а). Последнее : akvvohinc, 07.02.23 18:36
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
akvvohinc
А в целом здесь плохо то, что Фокс по-разному себя ведет для строковых переменных и memo-полей - не симметрично - то есть закинуть длинную строку в memo проблем нет,
Неужто прямо из переменной? Или таки из файла?
Цитата:
а сделать обратное без "извращений" не получится.
То же происходит и при работе с функциями - над длинными строками они работают (не знаю, правда, все ли?), а над memo вылезает ограничение.
Разумеется. Не надо путать теплое с мягким. Переменная памяти и файл на диске - две большие разницы.
При работе с файлами через мемо ничего не обрезается, переменные имеют меньшее ограничение по размеру и ведут себя по-другому.
Функции работы с переменными не обязаны работать с файлами точно так же, как и с переменными. А для работы мемо с файлами есть отдельные опции команд.


------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
akvvohinc
Цитата:
это именно то, что мне нужно. Вместе с GETWORDCOUNT сразу вспомнился GETWORDNUM, и пара этих функций эффективно и просто решает мою проблему.
Оригинальный финал.
Оказывается, несмотря на желание
Цитата:
"посчитать сколько символов CR в мемо-поле"
проблема была вовсе не в этом.
А две функции, работающие со словами, более эффективны для подсчета символов, чем одна, специально для этого предназначенная. Теперь, видимо, придется все свои проги проверять на предмет повышения их эффективности парой этих функций.

Но всё же хотелось бы знать, какую проблему надо было решить на самом деле?
Исходя из написанного выше, могу предположить, что ALINES() была бы ещё эффективнее, чем та пара функций.
Не факт. далеко не факт. Сия функция может насчитать тучи строк даже при полном отсутствии нужных символов. Почитайте про Set memowidth

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Неужто прямо из переменной? Или таки из файла?
Я имел в виду "прямо из переменной".

Цитата:
Переменная памяти и файл на диске - две большие разницы.
Я сравнивал работу с переменной и memo-полем.
При чем здесь файл на диске?
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Не факт. далеко не факт. Сия функция может насчитать тучи строк даже при полном отсутствии нужных символов. Почитайте про Set memowidth
Это лишнее - ALINES() от этой настройки не зависит.
Ratings: 0 negative/1 positive
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
переменные имеют меньшее ограничение по размеру и ведут себя по-другому.
Ещё раз - я сравнивал работу строковых функций с переменными и memo-полем - "файлы на диске" я не трогал.

И оказалось, что различия, действительно, есть:
1) Функция OCCURS() будет работать со строковой переменной размером более 16M, а с memo-полем такого же размера - не будет.
2) Можно заполнить memo-поле значением длинной строки одной командой, то нельзя сделать обратное.
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
_vit

Сообщений: 5173
Дата регистрации: 29.07.2002
akvvohinc
"файлы на диске" я не трогал.

Сергей имел в виду что мемо поле хранится в FPT файле.

Вообще в доке сказано конкретно:
Цитата:
Maximum # of characters per character string or memory variable. 16,777,184

А дальше начинается интересное.

On Error Do errorhand with ERROR( ), MESSAGE( ), MESSAGE(1)
CLEAR
Local lcLargeString, lcLargeString2
lcLargeString = Replicate("a", 16777184) && OK
lcLargeString = ""
lcLargeString = Replicate("a", 16777185) && Error
lcLargeString = ""
lcLargeString = Replicate("a", 16777184) + "b" && Error
lcLargeString = ""
lcLargeString = Replicate("a", 16777184)
lcLargeString = lcLargeString + "b" && OK
? Len(lcLargeString)
lcLargeString2 = lcLargeString + Replicate("a", 16777184) && Error
lcLargeString = lcLargeString + Replicate("a", 16777184) && OK
Return
Procedure errorhand(merror, mess, mess1)
? merror, mess, mess1
Endproc
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
() хорошо бы, если бы автор (бы) перезадал вопрос в свете произошедших реакций, ответов...

В фоксе с символами все просто - и посчитать, и "переводы строки"... обычная амерская ASCII, в т.ч. спецсимволы



Исправлено 1 раз(а). Последнее : of63, 08.02.23 00:18
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Сергей имел в виду что мемо поле хранится в FPT файле.
Ничего подобного - в его сообщении memo-поле и файлы на диске - разные вещи.

Два примера:
Цитата:
Функции работы с переменными не обязаны работать с файлами точно так же, как и с переменными. А для работы мемо с файлами есть отдельные опции команд.

ssa
akvvohinc
А в целом здесь плохо то, что Фокс по-разному себя ведет для строковых переменных и memo-полей - не симметрично - то есть закинуть длинную строку в memo проблем нет,
Неужто прямо из переменной? Или таки из файла?
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
А дальше начинается интересное.
Ты просто не участвовал в одной из тем по этому поводу - всё это мы уже однажды прошли.
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Maximum # of characters per character string or memory variable. 16,777,184
Как оказалось, для переменной такого ограничения "почти" нет.
И если очень хочется, то создать переменную гораздо большего размера несложно. А дальнейшая с ней работа во многом зависит от ее размера, размера оперативки (и, возможно, каких-то настроек Фокса, связанных с использованием памяти - для VFP не выяснял, но в FPD использовал MEMLIMIT).

Думаю, в пределах 100Мб большинство современных компов стандартной комплектации справятся "всегда".
Я свой текущий предел с точностью до 1 Мб не выяснял, но прямо сейчас получилось создать 4 строки общим размером около 1000Мб, а следующий файл на 170Мб выдал ошибку "...not enough memory..." при использовании FILETOSTR().

И функция OCCURS() нормально отработала на строках такого размера (но не на мемо - там строго 16Мб).
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Не усложняй до бесконечности, Александр. Важно (относительно) понимать проблему (это бывает еще и не проблема) в "идеальном" варианте () как кролики в Алисе в СЧ - важно, не важно... как скажут) , в ... тем более в несчсчастных "100мБ"... и 16Мб - там не "строго"... просто непредсказуемо (ни разу не нарывался, я все в файле делаю, в курсоре... не сталкивался с непредсказуюстемотью... было другое, немного от фокса грехов буквально 1-2 греха..., и то, не вспомню, незначительное...
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
в ... тем более в несчсчастных "100мБ"... и 16Мб - там не "строго"... просто непредсказуемо
Я постоянно пользуюсь таким вариантом - FILETOSTR(), никогда не проверяю размер файла (конечно, даже 50Mб встречаются у меня не часто), и, понимая что когда-нибудь программа может свалиться, иду на такой "риск".
Пока ни разу не случилась ситуация, чтобы такие строки вызвали проблему (ошибку), так что удобство работы с "одной длинной строкой" пока перевешивает.
Так что я знаю о "непредсказуемости", но пренебрегаю рисками, считая их крайне низкими на современных компах.

Иногда мне приходится работать с видео-файлами - они обычно существенно больших размеров, чем разные виды "текстовых".
Там риск уже становится неуместен - ошибки будут случаться чаще, чем нормальная работа.
В этих случаях приходится работать с файлами по частям, загоняя их в строку функциями низкого уровня - FREAD()/FWRITE()/FSEEK().

PS
А вообще я охотнее откликаюсь на имя Сергей.
Ratings: 0 negative/1 positive
Re: посчитать символы CR в мемо-поле
glaz58

Сообщений: 812
Откуда: Воронеж
Дата регистрации: 09.02.2008
Может быть ALINES() эффективнее (а как измерить?), но я раньше эту функцию не применял. А Getwordcount() и Getwordnum() применял. Просто прочтя ответ OF63 мне мгновенно всё прояснилось и отпала необходимость искать что-то ещё. Спасибо за внимание к моему вопросу.
Ratings: 0 negative/0 positive
Re: посчитать символы CR в мемо-поле
akvvohinc
Автор

Сообщений: 4201
Откуда: Москва
Дата регистрации: 11.11.2008
Цитата:
Может быть ALINES() эффективнее (а как измерить?)
Это не требует измерений.
И так очевидно, что одна функция, написанная на языке низкого уровня и вызванная только один раз, даст фору коду, написанному на Фоксе, где в цикле много раз вызывается пусть даже тоже одна функция (плюс один раз будет вызвана еще одна).
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 21 Владимир Максимов  (Гостей: 20)

© 2000-2024 Fox Club 
Яндекс.Метрика