Unlock a world of possibilities! Login now and discover the exclusive benefits awaiting you.
Всем доброго времени суток.
Может кто подскажет решение.
Что бы упростить, покажу на вымышленных примерах. Существуют две таблицы: ФИО и Должности.
Задача состоит в том чтоб заменить значение поля ФИО на значение из поля должность. Т.е. если встречается подходящая фамилия в столбце ФИО то его значение переименовывается на соответствующую должность. Например: "Гожий Павел Анатольевич" будет заменен на "Маркетолог" и т.д. (Сразу оговорюсь что как-либо подготовить столбец ФИО не возможно т.к. в реальном проекте там названия агентств без пробелов и очень длинные). Я пробовал Applymap но она ищет только точно совпадающие значения, а функция MapSubstring ищет по маске но заменяет не все поле а только совпадающую часть по маске. Может быть это можно сделать с помощью цикла "For..next"?
Заранее благодарен.
Вот такой вариант:
Штаты:
LOAD * INLINE [
Фамилия, Должность
Бутенко, Директор
Гожий, Завхоз
Стремаков, Менеджер
Кирсанов, Маркетолог
];
inner join LOAD * INLINE [
ФИО
БутенкоАлександрВладимирович
ГожийПавелАнатольевич
СтремаковСтепанПетрович
ГольдштейнВладимирДмитриевич
КирсановПетрНиколаевич
];
Tmp1:
NoConcatenate
LOAD * Resident Штаты
Where Index([ФИО],[Фамилия])>0;
DROP Table Штаты;
День добрый.
А если при открытии таблицы ФИО, формировать ключевое поле для второй таблицы. И по нему уже производить сопоставление.
Или следует рассматривать вариант когда значение ФИО записано без пробелов?
Т.е. требуется провести анализ строки на предмет соответствия одному из значений из поля Фамилия? А если встретится Гольдштейн-Кирсанов?
Добрый день EugenyIlyin
Спасибо за ответ.
Второй вариант предпочтительнее: следует провести анализ строки на предмет соответствия одному из значений из поля Фамилия. Вариант Гольдштейн-Кирсанов исключается, так как во первых по логике проекта такого не будет а во вторых соответствие следует проводить только если строка начинается с Фамилии, а не содержит ее вообще.
Штаты:
Mapping LOAD * INLINE [
Фамилия, Должность
Бутенко, Директор
Гожий, Завхоз
Стремаков, Менеджер
Кирсанов, Маркетолог
];
Кадры:
LOAD ФИО, ApplyMap('Штаты',left(ФИО,index(ФИО,' ')-1)) as Должность INLINE [
ФИО
Бутенко Александр Владимирович
Гожий Павел Анатольевич
Стремаков Степан Петрович
Гольдштейн Владимир Дмитриевич
Кирсанов Петр Николаевич
];
Как вариант не подходит?
Дело в том что на реальном проекте в записи ФИО нет пробелов или других четких символов по которым можно однозначно вычленить искомое значение. т.е. вариант искать только по "маске".
Но ФИО всегда начинается с Фамилии?
Вот такой вариант:
Штаты:
LOAD * INLINE [
Фамилия, Должность
Бутенко, Директор
Гожий, Завхоз
Стремаков, Менеджер
Кирсанов, Маркетолог
];
inner join LOAD * INLINE [
ФИО
БутенкоАлександрВладимирович
ГожийПавелАнатольевич
СтремаковСтепанПетрович
ГольдштейнВладимирДмитриевич
КирсановПетрНиколаевич
];
Tmp1:
NoConcatenate
LOAD * Resident Штаты
Where Index([ФИО],[Фамилия])>0;
DROP Table Штаты;
Супер! Вариант работает.
Огромная Вам благодарность Eugenyllyin!
Можно к значениям Должность добавить в конце редкий символ, например %.
С помощью Mapstring() сделать замену, как вы и пробовали, а потом ориентируясь на позицию % в строке отрезать лишнее.
Что-то типа left(Mapstring(...), index(Mapstring(...), '%')-1 ) .
Либо, чтобы два раза не мэппить:
Table:
Load *, left(Temp, index(Temp,'%')-1 ) as Result;
Load ФИО,
Mapstring(...) as Temp,
...
from ...
Еще сверху можно навесить условие if, если нет %, то заменять на 'Прочее'.
Добрый день Anna
Ваш вариант также прекрасно работает,
спасибо за ответ.