Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
Не совсем так. В случае строки OCCURS() считает символы согласно документации, то есть все, а не только в первых 16Mb. В вашем примере сама операция присвоения "обрежет" строку до 16Mb, поэтому и счет символов будет вестись только в них. Если же создать строку, допустим в 100Mb, то OCCURS() посчитает символы для всей строки. Это дела не меняет - результат всё равно будет неверным для строк такой длины. Один из возможных вариантов - получать строку из memo по частям (цикле). Но ТС хотел обойтись без циклов. Вот так можно обойтись без циклов:
Ещё способ:
Но всё это не особенно надежно, так как никогда не знаешь, строку какой длины сможет "прожевать" твой комп в текущих условиях. Вот у меня сейчас строка размером в 600Mb создалась без проблем, а для строки в 1000Mb выдалась ошибка "... not enough memory..." Исправлено 6 раз(а). Последнее : akvvohinc, 06.02.23 22:41 ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
В общем, в таком, например, варианте ваш пример валиться не будет, но работать такая конструкция будет достаточно долго:
PS А вообще, при таких размерах memo таблица и 100 записей "не выдержит" - лимит на 2Гб прекратит все мучения. ![]() Исправлено 4 раз(а). Последнее : akvvohinc, 06.02.23 23:23 ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
ABB Сообщений: 125 Откуда: Санкт-Петербург Дата регистрации: 21.10.2006 |
|
Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
Ничего из этого старого не забыто.
![]() Для меня новостью стало то, что при обычном присвоении значения memo-поля строке, его значение "обрезается" до 16M, то есть такая "проблема" с memo есть всегда, а не только при использовании функций OCCURS() или, как в той теме, функции STRTOFILE(). Разница лишь в том, что строка при присвоении обрезается молча, без ошибки, но это ещё хуже. ![]() А в целом здесь плохо то, что Фокс по-разному себя ведет для строковых переменных и memo-полей - не симметрично - то есть закинуть длинную строку в memo проблем нет, а сделать обратное без "извращений" не получится. То же происходит и при работе с функциями - над длинными строками они работают (не знаю, правда, все ли?), а над memo вылезает ограничение. ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
glaz58 Сообщений: 782 Откуда: Воронеж Дата регистрации: 09.02.2008 |
Спасибо of63, это именно то, что мне нужно. Вместе с GETWORDCOUNT сразу вспомнился GETWORDNUM, и пара этих функций эффективно и просто решает мою проблему. Без всяких нейросетей. Для меня могу считать тему закрытой.
Исправлено 1 раз(а). Последнее : glaz58, 07.02.23 17:20 ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата:Оригинальный финал. Оказывается, несмотря на желание Цитата:проблема была вовсе не в этом. ![]() А две функции, работающие со словами, более эффективны для подсчета символов, чем одна, специально для этого предназначенная. Теперь, видимо, придется все свои проги проверять на предмет повышения их эффективности парой этих функций. Но всё же хотелось бы знать, какую проблему надо было решить на самом деле? Исходя из написанного выше, могу предположить, что ALINES() была бы ещё эффективнее, чем та пара функций. ![]() Исправлено 1 раз(а). Последнее : akvvohinc, 07.02.23 18:36 ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
ssa Сообщений: 12909 Откуда: Москва Дата регистрации: 23.03.2005 |
Неужто прямо из переменной? Или таки из файла? Цитата:Разумеется. Не надо путать теплое с мягким. Переменная памяти и файл на диске - две большие разницы. При работе с файлами через мемо ничего не обрезается, переменные имеют меньшее ограничение по размеру и ведут себя по-другому. Функции работы с переменными не обязаны работать с файлами точно так же, как и с переменными. А для работы мемо с файлами есть отдельные опции команд. ------------------ Лень - это неосознанная мудрость. ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
ssa Сообщений: 12909 Откуда: Москва Дата регистрации: 23.03.2005 |
Не факт. далеко не факт. Сия функция может насчитать тучи строк даже при полном отсутствии нужных символов. Почитайте про Set memowidth ------------------ Лень - это неосознанная мудрость. ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата:Я имел в виду "прямо из переменной". Цитата:Я сравнивал работу с переменной и memo-полем. При чем здесь файл на диске? ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата:Это лишнее - ALINES() от этой настройки не зависит. ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата:Ещё раз - я сравнивал работу строковых функций с переменными и memo-полем - "файлы на диске" я не трогал. ![]() И оказалось, что различия, действительно, есть: 1) Функция OCCURS() будет работать со строковой переменной размером более 16M, а с memo-полем такого же размера - не будет. 2) Можно заполнить memo-поле значением длинной строки одной командой, то нельзя сделать обратное. ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
_vit Сообщений: 5090 Дата регистрации: 29.07.2002 |
Сергей имел в виду что мемо поле хранится в FPT файле. Вообще в доке сказано конкретно: Цитата: А дальше начинается интересное. ![]()
![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
of63 Сообщений: 24007 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
() хорошо бы, если бы автор (бы) перезадал вопрос в свете произошедших реакций, ответов...
В фоксе с символами все просто - и посчитать, и "переводы строки"... обычная амерская ASCII, в т.ч. спецсимволы Исправлено 1 раз(а). Последнее : of63, 08.02.23 00:18 ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата:Ничего подобного - в его сообщении memo-поле и файлы на диске - разные вещи. ![]() Два примера: Цитата:
![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата:Ты просто не участвовал в одной из тем по этому поводу - всё это мы уже однажды прошли. ![]() ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата:Как оказалось, для переменной такого ограничения "почти" нет. И если очень хочется, то создать переменную гораздо большего размера несложно. А дальнейшая с ней работа во многом зависит от ее размера, размера оперативки (и, возможно, каких-то настроек Фокса, связанных с использованием памяти - для VFP не выяснял, но в FPD использовал MEMLIMIT). Думаю, в пределах 100Мб большинство современных компов стандартной комплектации справятся "всегда". Я свой текущий предел с точностью до 1 Мб не выяснял, но прямо сейчас получилось создать 4 строки общим размером около 1000Мб, а следующий файл на 170Мб выдал ошибку "...not enough memory..." при использовании FILETOSTR(). И функция OCCURS() нормально отработала на строках такого размера (но не на мемо - там строго 16Мб). ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
of63 Сообщений: 24007 Откуда: Н.Новгород Дата регистрации: 13.02.2008 |
Не усложняй до бесконечности, Александр. Важно (относительно) понимать проблему (это бывает еще и не проблема) в "идеальном" варианте () как кролики в Алисе в СЧ - важно, не важно... как скажут) , в ... тем более в несчсчастных "100мБ"... и 16Мб - там не "строго"... просто непредсказуемо (ни разу не нарывался, я все в файле делаю, в курсоре... не сталкивался с непредсказуюстемотью... было другое, немного от фокса грехов буквально 1-2 греха..., и то, не вспомню, незначительное...
![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата:Я постоянно пользуюсь таким вариантом - FILETOSTR(), никогда не проверяю размер файла (конечно, даже 50Mб встречаются у меня не часто), и, понимая что когда-нибудь программа может свалиться, иду на такой "риск". Пока ни разу не случилась ситуация, чтобы такие строки вызвали проблему (ошибку), так что удобство работы с "одной длинной строкой" пока перевешивает. Так что я знаю о "непредсказуемости", но пренебрегаю рисками, считая их крайне низкими на современных компах. Иногда мне приходится работать с видео-файлами - они обычно существенно больших размеров, чем разные виды "текстовых". Там риск уже становится неуместен - ошибки будут случаться чаще, чем нормальная работа. В этих случаях приходится работать с файлами по частям, загоняя их в строку функциями низкого уровня - FREAD()/FWRITE()/FSEEK(). PS А вообще я охотнее откликаюсь на имя Сергей. ![]() ![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
glaz58 Сообщений: 782 Откуда: Воронеж Дата регистрации: 09.02.2008 |
Может быть ALINES() эффективнее (а как измерить?), но я раньше эту функцию не применял. А Getwordcount() и Getwordnum() применял. Просто прочтя ответ OF63 мне мгновенно всё прояснилось и отпала необходимость искать что-то ещё. Спасибо за внимание к моему вопросу.
![]() |
Re: посчитать символы CR в мемо-поле | |
---|---|
akvvohinc Автор Сообщений: 3836 Откуда: Москва Дата регистрации: 11.11.2008 |
Цитата:Это не требует измерений. И так очевидно, что одна функция, написанная на языке низкого уровня и вызванная только один раз, даст фору коду, написанному на Фоксе, где в цикле много раз вызывается пусть даже тоже одна функция (плюс один раз будет вызвана еще одна). ![]() |
© 2000-2023 Fox Club  |