Привет Всем! С корпоративного портала Коллеги делают одну и ту же выгрузку, но в разных языках (рус\анг) и в связи с этим меняется формат даты (08.09.2021\09/08/2021) Power Query при выборе формата "Дата", видимо распознает дату, как зашито в настройках windows (рус) и 09/08/2021 воспринимает, как текст. Конечно есть вариант выбрать формат "Используя локаль" и выбрать необходимый язык, но постоянно менять это конечным пользователям, не вариант.
Код
= Table.TransformColumnTypes(#"Повышенные заголовки",{{"Дата", type date}})
Код
= Table.TransformColumnTypes(#"Повышенные заголовки", {{"Дата", type date}}, "lkt-US")
Подскажите пожалуйста, как можно универсализировать этот момент?
Доброе время суток. Чуть более универсальный вариант
Код
let
slashContains = (text1, text2) => Text.Contains(text1, text2),
transformDateColumn = (forTable as table, dateColumnName) =>
let
cultureSign = if List.Contains(Table.Column(forTable, dateColumnName), "/", slashContains) then "en-US" else "ru-RU"
in
Table.TransformColumnTypes(forTable, {{dateColumnName, Date.Type}}, cultureSign),
Source = Excel.CurrentWorkbook(){[Name="Таблица1"]}[Content],
test = transformDateColumn(Source, "В1")
in
test
Проблема в том, что если указать локализацию "en", то PQ будет искать в первой позиции месяц, а во второй день. А в Ваших данных первым идет день, а вторым месяц. Надо четко понимать как данные записаны. Может вообще достаточно будет заменить слеш на точку, если имеет место быть такой бардак(т.е. не полностью локализация En, а просто разделитель En, а все остальное как было, так и осталось). Уверен, если не просто сменить разделитель в системе, но и локализацию - то вариант Андрея сработает на ура.
Ну, а что вы собственно хотели? Как аукнулось - так и откликнулось. Ну, можно в вашем случае попытаться разбить текст по / и по второму элементу получившегося списка определить, что там есть число большее 12 - тогда там день и формат mm/dd/yyyy. Но, что если там числа не превышающие 12? Тогда как автоматически определить это формат mm/dd/yyyy или dd/mm/yyyy? Предложите однозначный критерий для такого определения.
Андрей VG, к сожалению, только по его содержимому, данных всегда довольно много, поэтому нарваться на ошибку, думаю, что не получиться Если хоть одно значение имеет больше 12 в начале, то это RU-столбец, а если все меньше или равны 12 то EN
Или может быть преобразовать в RU, а если есть ошибки, то в EN
evgeniygeo написал: Если хоть одно значение имеет больше 12 в начале, то это RU-столбец, а если все меньше или равны 12 то EN
Крайне наивно. А что если в столбце только одно значение 08/09/2021 - это 8 сентября или 9 августа? Код ниже даст 9 августа
Код
let
listItemToNumber = (items as list) as list => List.Transform(items, Number.From),
transformDateColumn = (forTable as table, dateColumnName as text) =>
let
items = List.Transform(Table.Column(forTable, dateColumnName), each listItemToNumber(Text.Split(_, "/"))),
defineMax = List.Transform(items, each if _{0} > _{1} then [pos = 0, max = _{0}] else [pos = 1, max = _{1}]),
max = List.Max(defineMax, null, (a, b) => a[max] - b[max]),
cultureSign = if max[pos] = 0 then "ru-RU" else "en-US"
in
Table.TransformColumnTypes(forTable, {{dateColumnName, Date.Type}}, cultureSign),
Source = Excel.CurrentWorkbook(){[Name="Таблица2"]}[Content],
test = transformDateColumn(Source, "В2")
in
test
Андрей VG, супер, то, что нужно! Только вот я опять забыл учесть один момент...могут быть пустые строчки На крайняк поменяю пусто на нереальную дату, а в конце обратно на пусто