Страницы: 1
RSS
объединение CSV файлов в power query, объединение CSV файлов в power query с разным количеством столбцов
 
Добрый день, уважаемые специалисты Excel. Большая просьба помочь мне в одном вопросе:
Нужно объединить файлы в формате  CSV в один в Power Query, так чтобы одинаковые столбцы стояли друг под другом , а остальные в конце.
прилагаю файлы, которые нужно объединить. Заранее благодарю.

в файле 5620810_16.10.2023-31.10.2023 - на 1 столбец больше, но его нужно тоже сохранить. в объединенном файле
 
Пример смотреть нужно в этом прикрепленном архиве. Здесь  CSv файлы. В первом примере формат ексель был.. Прошу прощения.  
 
Ольга Салтыкова, убрал первую и последнюю строки. Но у вас еще кривая строка "корректировка" в конце одного из файлов болтается. Собственно, из-за нее пришлось вильнуть Table.FromColumns -> Table.Transpose.
Код
let
    files = Folder.Files("путь_к_папке\трафареты")[Content],
    tbls = List.Transform(
        files,
        (x) => 
            [lines = Lines.FromBinary(x, QuoteStyle.None, false, 65001),
            lst = List.Buffer(List.RemoveFirstN(List.RemoveLastN(lines, 1), 1)),
            txform = List.Transform(lst, Splitter.SplitTextByDelimiter(";")),
            tbl = Table.FromColumns(txform),
            tpose = Table.Transpose(tbl),
            ph = Table.PromoteHeaders(tpose, [PromoteAllScalars=true])][ph]
    ),
    result = Table.Combine(tbls)
in
    result 
Пришелец-прораб.
 

AlienSx, Спасибо большое! А можно оставить строки ВСЕГО? они очень важны для  дальнейших вычислений. Сама я не справлюсь..

 
Цитата
Ольга Салтыкова написал:
можно оставить строки ВСЕГО?
можно
Код
let
    files = Folder.Files("путь_к_папке\трафареты")[Content],
    tbls = List.Transform(
        files,
        (x) => 
            [lines = Lines.FromBinary(x, QuoteStyle.None, false, 65001),
            lst = List.Buffer(List.RemoveFirstN(lines, 1)),
            txform = List.Transform(lst, Splitter.SplitTextByDelimiter(";")),
            tbl = Table.FromColumns(txform),
            tpose = Table.Transpose(tbl),
            ph = Table.PromoteHeaders(tpose, [PromoteAllScalars=true])][ph]
    ),
    result = Table.Combine(tbls)
in
    result 
Пришелец-прораб.
 
AlienSx, Спасибо огромное. Разобраться наверно, не смогу, но,  главное работает). Т.е. если я буду загружать туда файлы и там появятся возможно еще столбцы или с другими названиями, то все должно работать? Или например, появится еще какая-нибудь строка типа Коррекция..  
 
Ольга Салтыкова, должно. Да вы попробуйте файлов в папку закинуть побольше, чего уж там.
Пришелец-прораб.
 
AlienSx, да, да, хочу это сделать)  
 
AlienSx, Извините, пожалуйста, не написала еще один момент. Мне нужно, чтобы сохранился номер кампании , который стоит в заголовке каждого файла

 Это важно. Сразу не увидела. Можно ли это оставить?  5620810_16.10.2023-31.10.2023
, 5208902_15.09.2023-30.09.2023 . Нужен номер до разделителя _.

А также оставить заголовки, как есть. Т.е. чтобы они повторялись. Тоже надо для дальнейшей обработки. Т. е по сути оставит все, только чтобы столбцы одинаковые были друг под другом, а лишние в конце. Прошу прощения за то, что сразу не написала.  
Изменено: Ольга Салтыкова - 27.11.2023 13:14:23
 
AlienSx, я прикрепила пример..  
 
Ольга Салтыкова, простите, но уже не осталось времени на ваши хотелки. Может кто-то другой поднимет упавшее знамя... Ну или в Работа обратитесь.
Пришелец-прораб.
 
AlienSx, очень жаль. Но, в любом случае, спасибо за помощь.  
 
Ольга Салтыкова,
немного откорректировал
Код
tbls = List.Transform(
        files,
        (x) => 
            [lines = Lines.FromBinary(x, QuoteStyle.None, false, 65001),
            lst = List.Buffer(List.RemoveFirstN(lines, 1)),
            txform = List.Transform(lst, (x)=>{Text.Replace(lines{0},";","")}&Text.Split(x, ";")), //здесь
            tbl = Table.FromColumns(txform),
            tpose = Table.Transpose(tbl),
            ph = Table.PromoteHeaders(tpose, [PromoteAllScalars=true]),
            ph1 = Table.RenameColumns(ph, {Table.ColumnNames(ph){0}, "Компания"})][ph1] //здесь
    ),
    nms = List.Distinct(List.Combine(List.Transform(tbls, (x)=> Table.ColumnNames(x)))), // и здесь
    result = Table.Combine(tbls, nms)
 
Garrys, неее, я не зря сбежал с поля боя  :D ТС хочет, чтобы не только добавилась колонка с номером кампании и общие столбцы ходили друг под другом, но еще чтобы воссоздать оригинальный вид CSV. А именно, с первой строкой и именами колонок во 2-й строке.
Цитата
Ольга Салтыкова написал:
Это важно.
🤦‍♂️ Я много раз порывался послать этот балаган куда подальше, но не устоял  :D

Код
let
    files = Folder.Files("путь_к_папке\трафареты")[Content],
    tbls = List.Transform(
        files,
        (x) => 
            [lines = Lines.FromBinary(x, QuoteStyle.None, false, 65001),
            lst = List.Buffer(List.RemoveFirstN(lines, 2)),
            names = List.Buffer(Splitter.SplitTextByDelimiter(";")(lines{1})),
            txform = List.Transform(lst, Splitter.SplitTextByDelimiter(";")),
            campaign = [Кампания = Text.BetweenDelimiters(Splitter.SplitTextByDelimiter(";")(lines{0}){1}, "№ ", ",")],
            rrr = List.Transform(txform, (x) => campaign & Record.FromList(x, List.FirstN(names, List.Count(x))))
                meta [h = Text.Remove(lines{0}, ";"), names = names]][rrr]
    ),
    tbl_buffered = List.Buffer(tbls),
    common_names = List.Buffer(List.Intersect(List.Transform(tbl_buffered, (x) => Value.Metadata(x)[names]))),
    yet_another_transform = List.Transform(
        tbl_buffered,
        (x) =>
            [current_names = Value.Metadata(x)[names],
            other_names = List.Difference(current_names, common_names),
            tbl = #table({"Column1"}, {{Value.Metadata(x)[h]}}) &
                Table.DemoteHeaders(
                    Table.FromRecords(x, {"Кампания"} & common_names & other_names, MissingField.UseNull)
                )][tbl]

    ),
    Z = Table.Combine(yet_another_transform)
in
    Z

Изменено: AlienSx - 27.11.2023 20:15:44
Пришелец-прораб.
 
Garrys, Спасибо большое!
 
AlienSx, и вам в очередной раз спасибо. ДА, не все такие умные, для этого и существует форум, по-моему, если знаешь и можешь- помоги бедолаге.  
 
Цитата
Ольга Салтыкова написал:
не все такие умные
дурное дело - нехитрое. А в том, что оно дурное, у меня лично сомнений нет. Кому может понадобиться эта таблица да еще для какой-то "дальнейшей обработки" - вот загадка. Но лучше мне об этом не знать...
P.S. А завтра вы придете вот с таким вопросом - у вас 3 файла. И какие-то колонки в них совпадают только в 2х файлах из 3х. И что делать в этом случае? Как располагать колонки? "Зачем арбуз полосатый? Зачем медведь косолапый? Я не знаю зачем..." Вот и я не знаю зачем вам все это нужно...
Изменено: AlienSx - 27.11.2023 21:50:50 (P.S.)
Пришелец-прораб.
 
Цитата
Ольга Салтыкова написал:
А можно оставить строки ВСЕГО?
AlienSx, я после этого даже смотреть далее не стал :)
Ольга Салтыкова, Вам на будущее. Не нужны эти строки Всего. Вам нужны именно плоские данные, а далее все агрегации делать в сводной таблице/Power Pivot.
 
AlienSx, да тоже как ребус для разрядки в конце рабочего дня) буду изучать метаданные!
Ольга Салтыкова, к сожалению, это бесполезная помощь
 
Цитата
Garrys написал:
буду изучать метаданные!
это уж точно лучше, чем бесполезно помогать :) Я не про ваши поправки к коду, если что, а про хотелки ТС. Все равно вернется к плоской таблице.
Изменено: AlienSx - 28.11.2023 13:36:48
Пришелец-прораб.
 
surkenny, у меня в строке всего в столбце Расход за минусом бонусов, ₽, с НДС  может быть цифра, а может нет. А это важно, Т.к. если она будет, то высчитывается разница между Расход, ₽, с НДС и Расход за минусом бонусов, ₽, с НДС и распределяется по строкам, но только того запроса ( name) , к которому эта разница относится. Если бы она мне была не важна, то я бы и не просила!  
 
Ольга Салтыкова, вот всю логику, которую Вы описали, нужно сразу сделать внутри csv и избавиться от итоговых строк.
Потом не сможете нормально анализировать в Power Pivot.
 
Ольга Салтыкова, вы нам не объясняете конечную цель вашего "путешествия". Вы просите сделать что-то, что по вашему мнению совершенно необходимо для достижения цели. А если вы ошибаетесь? Вам здесь на форуме говорят "астанавитесь". Подумайте, может стоит по-другому подойти к решению вашей проблемы? Может вы нам объясните чего вы хотите добиться в конце? А то все это смахивает на типичную x-y problem.
Пришелец-прораб.
Страницы: 1
Наверх