powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Найти максимум в символьной строке
25 сообщений из 27, страница 1 из 2
Найти максимум в символьной строке
    #37908260
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть символьное поле (А;FF,V и т.д. -это столбцы Excel), надо найти максимальное и сопоставить ему номер столбца (чертовы 16384 записей... в Import формата CSV нет, есть в Append from, но для него надо создать таблицу, следовательно надо узнать сколько полей, можно Fopen и подсчитать, но как всегд охота одной строкой и сразу..., может кто и знает)
Ввожу формулу
CALCULATE MAX(UPPER(ALLTRIM(n_col))), выдаёт V, когда максимальный столбец FF..
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908279
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
тут подумал, может перейти из десятичной системы в 27(кол-во букв латинского алфавита), и уже в этой системе попробовать подсчитать..., а как перейти в VFP, из одной системы в другую..., блин в математике слаб...чувствуется тут должен стоять натуральный логарифм...
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908286
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Откуда фоксу знать что это закодированные числа?
Для сравнения строк "V" > "FF"
делай в два шага:
Код: sql
1.
2.
CALCULATE MAX(len(ALLTRIM(n_col))) to lnLen && Вычисляем макс.кол-во знаков
CALCULATE MAX(UPPER(ALLTRIM(n_col))) for len(ALLTRIM(n_col)) = lnLen
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908287
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Надо добавить ведущий пробел для значений из одного символа.

Код: sql
1.
CALCULATE MAX(UPPER(PADL(LTRIM(n_col),2)))
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908288
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо...
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908292
IgorNG
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
q1w1e1есть символьное поле (А;FF,V и т.д. -это столбцы Excel), надо найти максимальное и сопоставить ему номер столбца (чертовы 16384 записей... в Import формата CSV нет, есть в Append from, но для него надо создать таблицу, следовательно надо узнать сколько полей, можно Fopen и подсчитать, но как всегд охота одной строкой и сразу..., может кто и знает)
Ввожу формулу
CALCULATE MAX(UPPER(ALLTRIM(n_col))), выдаёт V, когда максимальный столбец FF..

А по-русски это как будет звучать: "есть символьное поле (А;FF,V и т.д. -это столбцы Excel), надо найти максимальное"
Что ты этой командой пытаешься подсчитать?
CALCULATE MAX(UPPER(ALLTRIM(n_col))), выдаёт V, когда максимальный столбец FF
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908297
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
IgorNGА по-русски это как будет звучать
Ответившие поняли :) попробуй догадаться
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908304
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Спасибо..., но как найденный максимум перевести в число.... ну типа А это 1, ff-это 162 столбец.. и т.д.
может через SQL запрос...с подзапросом....
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908388
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
q1w1e1Спасибо..., но как найденный максимум перевести в число.... ну типа А это 1, ff-это 162 столбец.. и т.д.
может через SQL запрос...с подзапросом....
В принципе, можно поиграться ASCII-кодами, поскольку буквы латинского алфавита идут последовательно без разрывов.

Код: sql
1.
2.
3.
For i=65 to 90
    ?i,Chr(i)
endfor



Соответственно, чтобы перевести ASCII-код в число надо просто вычесть 64.

Код: sql
1.
2.
lcColumn = 'FF'
?(ASC(substr(lcColumn,1,1))-64)*26 + (ASC(substr(lcColumn,2,1))-64)



Только гораздо проще создать таблицу (ну, или массив), и использовать поле таблицы или индекс массива. В смысле, выполнять поиск в этой служебной таблице нужной записи. Кстати, таблицу можно использовать в запросах, объединяя ее по Inner Join.

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
local lcLetter1, lcLetter2
create cursor ColumnExcel (colNum I, colLetter C(2))
for m.lnI = 1 to 255
    if m.lnI <= 26
        lcLetter1 = CHR(m.lnI + 64)
        lcLetter2 = ''
    else
        lcLetter1 = CHR(int(m.lnI/26) + 64)
        lcLetter2 = CHR(evl(mod(m.lnI,26),26) + 64)
    endif
    insert into ColumnExcel (colNum, colLetter) values (m.lnI, m.lcLetter1 + m.lcLetter2)
endfor

* Смотрим, что получилось
select ColumnExcel 
go top
browse
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908433
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Универсальное преобразование через ASCII-коды будет выглядеть примерно так

Код: sql
1.
2.
3.
4.
5.
lcColumn = 'FF'
?(ASC(left(padl(lcColumn,2,Chr(64)),1))-64)*26 + (ASC(right(lcColumn,1))-64)

lcColumn = 'A'
?(ASC(left(padl(lcColumn,2,Chr(64)),1))-64)*26 + (ASC(right(lcColumn,1))-64)


Хотя, повторюсь, удобнее использовать таблицу перекодировки.
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908443
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Большое Вам спасибо...:-)
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908471
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМУниверсальное преобразование через ASCII-коды будет выглядеть примерно так
...
Хотя, повторюсь, удобнее использовать таблицу перекодировки.
Таблицу перекодировки тоже надо будет как-то заполнять, поэтому без функции не обойтись, а если есть функция то зачем таблицы лишние?
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908568
Sergey Sizov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМУниверсальное преобразование через ASCII-коды будет выглядеть примерно так

Код: sql
1.
2.
3.
4.
5.
lcColumn = 'FF'
?(ASC(left(padl(lcColumn,2,Chr(64)),1))-64)*26 + (ASC(right(lcColumn,1))-64)

lcColumn = 'A'
?(ASC(left(padl(lcColumn,2,Chr(64)),1))-64)*26 + (ASC(right(lcColumn,1))-64)


Хотя, повторюсь, удобнее использовать таблицу перекодировки.А есть еще нотация R1C1, не требующая таких танцев с бубнами.
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908597
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
есть конечно же нотация...R1C1, но в данном случае реализовано так, что оператор указывает в каком столбце что находится, например наименование в столбце "A" и т.д., это долго объяснять, зачем и почему.. и отвлекает от развития основной канвы решения волпроса...:-))
"ВладимирМ", хорошию идею подал со смещением...ASC(left(padl(lcColumn,2,Chr(64)),1))-64)*26 + (ASC(right(lcColumn,1))-64), я подумал что было бы гораздо удобней воспользоваться
CHRTRAN("ABCDEFGHIJKLMNOPQRSTUVWXYZ",123....но как только дошёл до 10 подумал, а можно ли и как букве "K" сопоставить 10....?
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908652
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
q1w1e1CHRTRAN("ABCDEFGHIJKLMNOPQRSTUVWXYZ",123....но как только дошёл до 10 подумал, а можно ли и как букве "K" сопоставить 10....?
не изобретай велосипедов с квадратными колесами :)
Владимир тебе все правильно написал, если хочешь доработать - сделай собственную функцию и вызывай ее. Как-то так:
Код: sql
1.
2.
3.
4.
func GetExcelNomColumn
lpara tcCol
tcCol = padl(alltrim(tcCol),2,chr(64))
return (ASC(left(tcCol, 1)-64)*26 + (ASC(right(tcCol,1))-64)
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908657
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
да я уже близок к разгадке...:-))
val(("1"+CHRTRAN(CHRTRAN(x,"ABCDEFGHI","123456789"),"JKLMNOPQRS","0123456789")...)
сейчас допишу... и подставлю в ваши смещения и процедуры..:-))
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908717
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
q1w1e1да я уже близок к разгадке...:-))
val(("1"+CHRTRAN(CHRTRAN(x,"ABCDEFGHI","123456789"),"JKLMNOPQRS","0123456789")...)
сейчас допишу... и подставлю в ваши смещения и процедуры..:-))
Кулибин
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908723
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Раз уж изобретаешь.
Подсказываю:
Код: sql
1.
2.
x = 'G'
? at(x, 'ABCDEFGHIJ...')
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908751
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
спасибо за подсказку... :-)
AT(SUBSTR(x,1,1),"ABCDEFGHIJKLMNOPQRSTUVWXYZ")+26*AT(SUBSTR(x,2,1),"ABCDEFGHIJKLMNOPQRSTUVWXYZ"), сейчас буду тестировать...
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908765
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ув. товарищи Кулибины! Почему бы на время обработки не включить всё-таки мозги стиль R1C1, а после обработки вернуть как было?
Код: sql
1.
2.
3.
4.
5.
*открыли книгу, потом
oExcel.Application.ReferenceStyle = xlA1
*дальше пишем что надо и не этовосамовываем мозги с чартранами и прочей ерундой
*после чего
oExcel.Application.ReferenceStyle = xlR1C1
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908768
tanglir
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В смысле наоборот - перед обработкой xlR1C1, а после xlA1 :)
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908790
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВладимирМУниверсальное преобразование через ASCII-коды будет выглядеть примерно так
...
Хотя, повторюсь, удобнее использовать таблицу перекодировки.
Таблицу перекодировки тоже надо будет как-то заполнять, поэтому без функции не обойтись, а если есть функция то зачем таблицы лишние?
Таблицу можно заполнить и вручную. Безо всяких функций.

Таблица удобнее много чем. Ну, например, в нее можно записать названия столбцов в разных регистрах. Тогда отпадет надобность в UPPER(). Таблицу проще использовать в запросах (насколько я понял у автора есть таблица, где поле - это буквы столбца). Много чего можно еще сделать, если есть список значений, а не функция.

PS: Если имя столбца из одной буквы, то left(), right() и substr() вернут одно и то же значение. Поэтому left() надо обязательно дополнять до 2 символов через padl().
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908800
q1w1e1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
потому что в начале надо создать таблицу с максимальным количеством столбцов, которые укажет оператор в стиле A1(заполненный диапазон ячеек открываемого документа может быть больше указанного оператором...), после этого как создана таблица с необходимым количеством столбцов(A... FF), заходим в Excel копируем в формате CSV, закрываем, в foxe делаем Append from в подготовленную таблицу и начинаем "разбор полётов"..:-)
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908917
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ВладимирМТаблица удобнее много чем.
На вкус и цвет все фломастеры разные (с) :)
По мне так функция удобнее, т.к. вероятность ошибки уменьшается, опечатка в таблице в одном значении и не увидишь пока не сглючит. Потом для поиска по таблице все равно надо код писать. Ну и при использовании в разных проектах функцию проще размножать.
...
Рейтинг: 0 / 0
Найти максимум в символьной строке
    #37908953
Фотография ВладимирМ
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TВладимирМТаблица удобнее много чем.
На вкус и цвет все фломастеры разные (с) :)
Угу. Поэтому все возражения зеркально возвращаются

Dima TПо мне так функция удобнее, т.к. вероятность ошибки уменьшается, опечатка в таблице в одном значении и не увидишь пока не сглючит.
Ошибка в формуле вокруг 26 столбца и не увидишь пока не потребуется этот самый 26 столбец. В общем случае, найти ошибку в формуле сложнее, чем ошибку в ограниченном наборе значений.

Dima TПотом для поиска по таблице все равно надо код писать.
Зато при использовании в запросах таблица не будет вызывать тормозов. Функцию невозможно воткнуть в ComboBox для быстрого выбора. Придется писать код проверки на допустимое значение. Везде, где потребуется отобразить список - придется писать дополнительный код по формированию-таки таблицы. Пусть и временной

Dima TНу и при использовании в разных проектах функцию проще размножать.
Копирование файла PRG ничем не отличается от копирования файла DBF.

Другими словами, если не требуется работать со значениями, которые возвращает функция, как со списком, то, действительно, разницы никакой. Вопрос исключительно личных предпочтений. Однако насколько я понял, автор темы все-таки предполагает работать со списком. Дать возможность пользователю выбрать идентификатор столбца. А в этом случае таблица вне конкуренции.
...
Рейтинг: 0 / 0
25 сообщений из 27, страница 1 из 2
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Найти максимум в символьной строке
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]