Гость
Форумы / FoxPro, Visual FoxPro [игнор отключен] [закрыт для гостей] / Найти максимум в символьной строке / 25 сообщений из 27, страница 1 из 2
08.08.2012, 10:32
    #37908260
q1w1e1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
есть символьное поле (А;FF,V и т.д. -это столбцы Excel), надо найти максимальное и сопоставить ему номер столбца (чертовы 16384 записей... в Import формата CSV нет, есть в Append from, но для него надо создать таблицу, следовательно надо узнать сколько полей, можно Fopen и подсчитать, но как всегд охота одной строкой и сразу..., может кто и знает)
Ввожу формулу
CALCULATE MAX(UPPER(ALLTRIM(n_col))), выдаёт V, когда максимальный столбец FF..
...
Рейтинг: 0 / 0
08.08.2012, 10:39
    #37908279
q1w1e1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
тут подумал, может перейти из десятичной системы в 27(кол-во букв латинского алфавита), и уже в этой системе попробовать подсчитать..., а как перейти в VFP, из одной системы в другую..., блин в математике слаб...чувствуется тут должен стоять натуральный логарифм...
...
Рейтинг: 0 / 0
08.08.2012, 10:41
    #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
08.08.2012, 10:42
    #37908287
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
Надо добавить ведущий пробел для значений из одного символа.

Код: sql
1.
CALCULATE MAX(UPPER(PADL(LTRIM(n_col),2)))
...
Рейтинг: 0 / 0
08.08.2012, 10:43
    #37908288
q1w1e1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
спасибо...
...
Рейтинг: 0 / 0
08.08.2012, 10:45
    #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
08.08.2012, 10:46
    #37908297
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
IgorNGА по-русски это как будет звучать
Ответившие поняли :) попробуй догадаться
...
Рейтинг: 0 / 0
08.08.2012, 10:50
    #37908304
q1w1e1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
Спасибо..., но как найденный максимум перевести в число.... ну типа А это 1, ff-это 162 столбец.. и т.д.
может через SQL запрос...с подзапросом....
...
Рейтинг: 0 / 0
08.08.2012, 11:19
    #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
08.08.2012, 11:30
    #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
08.08.2012, 11:35
    #37908443
q1w1e1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
Большое Вам спасибо...:-)
...
Рейтинг: 0 / 0
08.08.2012, 11:44
    #37908471
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
ВладимирМУниверсальное преобразование через ASCII-коды будет выглядеть примерно так
...
Хотя, повторюсь, удобнее использовать таблицу перекодировки.
Таблицу перекодировки тоже надо будет как-то заполнять, поэтому без функции не обойтись, а если есть функция то зачем таблицы лишние?
...
Рейтинг: 0 / 0
08.08.2012, 12:20
    #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
08.08.2012, 12:28
    #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
08.08.2012, 12:47
    #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
08.08.2012, 12:49
    #37908657
q1w1e1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
да я уже близок к разгадке...:-))
val(("1"+CHRTRAN(CHRTRAN(x,"ABCDEFGHI","123456789"),"JKLMNOPQRS","0123456789")...)
сейчас допишу... и подставлю в ваши смещения и процедуры..:-))
...
Рейтинг: 0 / 0
08.08.2012, 13:08
    #37908717
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
q1w1e1да я уже близок к разгадке...:-))
val(("1"+CHRTRAN(CHRTRAN(x,"ABCDEFGHI","123456789"),"JKLMNOPQRS","0123456789")...)
сейчас допишу... и подставлю в ваши смещения и процедуры..:-))
Кулибин
...
Рейтинг: 0 / 0
08.08.2012, 13:10
    #37908723
Dima T
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
Раз уж изобретаешь.
Подсказываю:
Код: sql
1.
2.
x = 'G'
? at(x, 'ABCDEFGHIJ...')
...
Рейтинг: 0 / 0
08.08.2012, 13:23
    #37908751
q1w1e1
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
спасибо за подсказку... :-)
AT(SUBSTR(x,1,1),"ABCDEFGHIJKLMNOPQRSTUVWXYZ")+26*AT(SUBSTR(x,2,1),"ABCDEFGHIJKLMNOPQRSTUVWXYZ"), сейчас буду тестировать...
...
Рейтинг: 0 / 0
08.08.2012, 13:28
    #37908765
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
Ув. товарищи Кулибины! Почему бы на время обработки не включить всё-таки мозги стиль R1C1, а после обработки вернуть как было?
Код: sql
1.
2.
3.
4.
5.
*открыли книгу, потом
oExcel.Application.ReferenceStyle = xlA1
*дальше пишем что надо и не этовосамовываем мозги с чартранами и прочей ерундой
*после чего
oExcel.Application.ReferenceStyle = xlR1C1
...
Рейтинг: 0 / 0
08.08.2012, 13:29
    #37908768
tanglir
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
В смысле наоборот - перед обработкой xlR1C1, а после xlA1 :)
...
Рейтинг: 0 / 0
08.08.2012, 13:37
    #37908790
ВладимирМ
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Найти максимум в символьной строке
Dima TВладимирМУниверсальное преобразование через ASCII-коды будет выглядеть примерно так
...
Хотя, повторюсь, удобнее использовать таблицу перекодировки.
Таблицу перекодировки тоже надо будет как-то заполнять, поэтому без функции не обойтись, а если есть функция то зачем таблицы лишние?
Таблицу можно заполнить и вручную. Безо всяких функций.

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

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

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

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

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

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


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