Страницы: 1
RSS
PQ разный формат даты
 
Привет Всем!  ;)
С корпоративного портала Коллеги делают одну и ту же выгрузку, но в разных языках (рус\анг) и в связи с этим меняется формат даты (08.09.2021\09/08/2021)
Power Query при выборе формата "Дата", видимо распознает дату, как зашито в настройках windows (рус) и 09/08/2021 воспринимает, как текст. Конечно есть вариант выбрать формат "Используя локаль" и выбрать необходимый язык, но постоянно менять это конечным пользователям, не вариант.
Код
= Table.TransformColumnTypes(#"Повышенные заголовки",{{"Дата", type date}})
Код
= Table.TransformColumnTypes(#"Повышенные заголовки", {{"Дата", type date}}, "lkt-US")
Подскажите пожалуйста, как можно универсализировать этот момент?
Изменено: evgeniygeo - 10.09.2021 09:33:47
 
Мой вариант решения, но работает только для англ...
Код
= try (Table.TransformColumnTypes(#"Повышенные заголовки", {{"Дата", type date}}, "en-EN")) otherwise Table.TransformColumnTypes(#"Повышенные заголовки", {{"Дата", type date}}, "ru-RU")
Плохой вариант...
Изменено: evgeniygeo - 10.09.2021 06:32:10
 
Доброе время суток.
Чуть более универсальный вариант
Код
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
 
Андрей VG,
прошу прощения, что ввел Вас в заблуждение, я указал некорректный формат для RU выгрузки.

Исправил в первом сообщении, но к сожалению Ваш вариант при таком раскладе работает только для EN.
Изменено: evgeniygeo - 10.09.2021 08:26:21
 
Проблема в том, что если указать локализацию "en", то PQ будет искать в первой позиции месяц, а во второй день. А в Ваших данных первым идет день, а вторым месяц.
Надо четко понимать как данные записаны. Может вообще достаточно будет заменить слеш на точку, если имеет место быть такой бардак(т.е. не полностью локализация En, а просто разделитель En, а все остальное как было, так и осталось). Уверен, если не просто сменить разделитель в системе, но и локализацию - то вариант Андрея сработает на ура.
Изменено: Дмитрий(The_Prist) Щербаков - 10.09.2021 08:39:11
Даже самый простой вопрос можно превратить в огромную проблему. Достаточно не уметь формулировать вопросы...
 
Цитата
evgeniygeo написал:
работает только для EN
Ну, а что вы собственно хотели? Как аукнулось - так и откликнулось. Ну, можно в вашем случае попытаться разбить текст по / и по второму элементу получившегося списка определить, что там есть число большее 12 - тогда там день и формат mm/dd/yyyy.
Но, что если там числа не превышающие 12? Тогда как автоматически определить это формат mm/dd/yyyy или dd/mm/yyyy? Предложите однозначный критерий для такого определения.
 
Дмитрий(The_Prist) Щербаков,
все верно, в обновленном примере так и есть (например: в 1 - 08/28/2021, а в 2 - 28/08/2021)  :)

Цитата
Дмитрий(The_Prist) Щербаков написал:
PQ будет искать в первой позиции месяц, а во второй день
Андрей VG,
понимаю, пытаюсь исправиться  :)
в столбце могут быть либо RU, либо EN, вперемешку быть не могут
Изменено: evgeniygeo - 10.09.2021 09:32:29
 
Цитата
evgeniygeo написал:
в столбце могут быть либо RU, либо EN,
Как однозначно по содержимому столбца это определить - когда RU, а когда EN? По его названию?
 
Андрей VG,
к сожалению, только по его содержимому, данных всегда довольно много, поэтому нарваться на ошибку, думаю, что не получиться
Если хоть одно значение имеет больше 12 в начале, то это RU-столбец, а если все меньше или равны 12 то EN

Или может быть преобразовать в RU, а если есть ошибки, то в EN
Изменено: evgeniygeo - 10.09.2021 09:54:14
 
Цитата
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,
супер, то, что нужно!  ;)
Только вот я опять забыл учесть один момент...могут быть пустые строчки  :sceptic:
На крайняк поменяю пусто на нереальную дату, а в конце обратно на пусто   :D  
Изменено: evgeniygeo - 10.09.2021 10:46:44
 
Цитата
evgeniygeo написал:
могут быть пустые строчки
Так в чём проблема? Просто удалить null элементы списка для анализа. Или вы код не хотите изучать?!
Код
items = List.Transform(List.RemoveNulls(Table.Column(forTable, dateColumnName)), each listItemToNumber(Text.Split(_, "/")))
 
Андрей VG,
да уж...пошел изучать
Спасибо Вам!  :)  
Страницы: 1
Наверх