Страницы: 1
RSS
Преобразовать лог в таблицу, Лог показаний в столбик а надо в таблицу
 
Данные набраны в текстовый файл, сначала дата\время, потом название датчика и потом его показание.
Как сделать чтобы было 6 столбцов (по каждому датчику) и в столбцах были значения датчиков?
Как я "представляю" макрос должен понять, что каждая строка это либо название, либо знеачение, соотественно определять и заносить.
Но как это делается?

Лог у меня вот в таком виде:
Скрытый текст
 
sin4ez,
думаю вот это должно подойти или это
Изменено: evgeniygeo - 27.07.2022 10:45:10
 
Вариант:
Код
let
  log = Excel.CurrentWorkbook(){[ Name = "log" ]}[Content],
  addDT = Table.AddColumn (
    log,
    "DateTime",
    each [
      lastDash = Text.PositionOf ( [Log], "-", Occurrence.Last ),
      replace  = if lastDash <> - 1 then Text.ReplaceRange ( [Log], lastDash, 1, " " ) else null,
      dt       = try DateTime.From ( replace ) otherwise null
    ][dt],
    type datetime
  ),
  group = Table.Group (
    addDT,
    "DateTime",
    {
      {
        "tbl",
        ( t ) =>
          [
            skip    = List.RemoveFirstN ( t[Log], 1 ),
            split   = List.Split ( skip, 2 ),
            toTable = Table.FromRows ( split, { "Датчик", "Показание" } )
          ][toTable],
        type table
      }
    },
    GroupKind.Local,
    ( s, c ) => Number.From ( c <> null )
  ),
  expand = Table.ExpandTableColumn ( group, "tbl", { "Датчик", "Показание" } ),
  typed = Table.TransformColumnTypes ( expand, { { "Показание", type number } }, "en-US" ),
  pivot = Table.Pivot ( typed, List.Distinct ( typed[Датчик] ), "Датчик", "Показание", List.Sum )
in
  pivot
 
Цитата
написал:
sin4ez,
думаю вот  это  должно подойти или  это
Про редактор запросов впервые услышал, надо разбираться. А второй пример очень близко, как я смотрю. Спасибо.
Изменено: sin4ez - 27.07.2022 14:07:02
 
surkenny, спасибо, буду разбираться
 
Цитата
написал:
подойти или  это
Попробовал, не как надо получается результат(
 
Примитивный кнопочный вариант
Код
let
    Source = Excel.CurrentWorkbook(){[Name="Table3"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"2022-07-25-16:58:25", type any}}),
    #"Demoted Headers" = Table.DemoteHeaders(#"Changed Type"),
    #"Added Index" = Table.AddIndexColumn(#"Demoted Headers", "Index", 0, 1),
    #"Inserted Modulo" = Table.AddColumn(#"Added Index", "Inserted Modulo", each Number.Mod([Index], 13), type number),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Inserted Modulo", {{"Inserted Modulo", type text}}, "lt-LT"), List.Distinct(Table.TransformColumnTypes(#"Inserted Modulo", {{"Inserted Modulo", type text}}, "lt-LT")[#"Inserted Modulo"]), "Inserted Modulo", "Column1"),
    #"Removed Columns" = Table.RemoveColumns(#"Pivoted Column",{"Index"}),
    #"Filled Down" = Table.FillDown(#"Removed Columns",{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}),
    #"Filled Up" = Table.FillUp(#"Filled Down",{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}),
    #"Added Index1" = Table.AddIndexColumn(#"Filled Up", "Index", 0, 1),
    #"Sorted Rows" = Table.Sort(#"Added Index1",{{"0", Order.Ascending}}),
    #"Removed Columns1" = Table.RemoveColumns(#"Sorted Rows",{"Index"}),
    #"Added Index2" = Table.AddIndexColumn(#"Removed Columns1", "Index", 0, 1),
    #"Inserted Modulo1" = Table.AddColumn(#"Added Index2", "Inserted Modulo", each Number.Mod([Index], 13), type number),
    #"Filtered Rows" = Table.SelectRows(#"Inserted Modulo1", each ([Inserted Modulo] = 0)),
    #"Renamed Columns" = Table.RenameColumns(#"Filtered Rows",{{"2", """DTS CPU1"""}, {"4", """DTS CPU2"""}, {"6", """Die CPU2"""}, {"8", """Die CPU1"""}, {"10", """CPU1VOLTAIGE"""}, {"12", """CPU2VOLTAGE"""}}),
    #"Removed Columns2" = Table.RemoveColumns(#"Renamed Columns",{"Index", "Inserted Modulo", "1", "3", "5", "7", "9", "11"}),
    #"Renamed Columns1" = Table.RenameColumns(#"Removed Columns2",{{"0", "Data, time"}})
in
    #"Renamed Columns1"
Изменено: jakim - 27.07.2022 23:03:35
 
На всякий случай сделал вариант с несложными формулами, вдруг пригодится. Если у вас в системе десятичный разделитель - точка, то можно еще упростить.
 
Цитата
sin4ez написал:
Попробовал, не как надо получается результат(
Так Вы покажите какой должен быть результат
 
Msi2102, вот как вторая таблица у memo, так хорошо.

memo, как это на полный лог в 100кБ применить?
Да и почему неполучается продлить ваши строки, после 3й хоть формула и есть, а результата нет
Изменено: sin4ez - 28.07.2022 16:36:03
 
Цитата
sin4ez написал:
Да и почему неполучается продлить ваши строки, после 3й хоть формула и есть, а резльутат нет
Уверены? В примере скопировал кусок лога в заданной последовательности и вставил, для наглядности изменил числа и результат, как видите есть. Что у меня, что в PQ варианте от surkenny, собственно, таблицу он и сделал, хотя по-идее ее должны были сделать Вы ;).
Попробуйте по надобности увеличить диапазон у формул, скажем с 10000 до 50000 или 100000 и т.д. Хотя для таких объемов PQ подходит гораздо лучше.
Скрин
Изменено: memo - 28.07.2022 16:36:25
 
Проверяйте
Код
let
    Source = Excel.CurrentWorkbook(){[Name="log"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Log", type text}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
    #"Inserted Modulo" = Table.AddColumn(#"Added Index", "Inserted Modulo", each Number.Mod([Index], 13), type number),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Inserted Modulo", {{"Inserted Modulo", type text}}, "lt-LT"), List.Distinct(Table.TransformColumnTypes(#"Inserted Modulo", {{"Inserted Modulo", type text}}, "lt-LT")[#"Inserted Modulo"]), "Inserted Modulo", "Log"),
    #"Removed Columns" = Table.RemoveColumns(#"Pivoted Column",{"Index"}),
    #"Filled Down" = Table.FillDown(#"Removed Columns",{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}),
    #"Filled Up" = Table.FillUp(#"Filled Down",{"0", "1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12"}),
    #"Added Index1" = Table.AddIndexColumn(#"Filled Up", "Index", 0, 1),
    #"Inserted Modulo1" = Table.AddColumn(#"Added Index1", "Inserted Modulo", each Number.Mod([Index], 13), type number),
    #"Filtered Rows" = Table.SelectRows(#"Inserted Modulo1", each ([Inserted Modulo] = 12)),
    #"Removed Columns1" = Table.RemoveColumns(#"Filtered Rows",{"1", "3", "5", "7", "9", "11", "Index", "Inserted Modulo"}),
    #"Renamed Columns" = Table.RenameColumns(#"Removed Columns1",{{"2", """DTS CPU1"""}, {"4", """DTS CPU2"""}, {"6", """Die CPU2"""}, {"8", """Die CPU1"""}, {"10", """ CPU1VOLTAGE"""}, {"12", """ CPU2VOLTAGE"""}, {"0", "DateTime"}})
in
    #"Renamed Columns"
Изменено: jakim - 28.07.2022 18:20:32
 
Самый лучший способ проверки-это вписать простые числа.
 
Немного разобрался, но пока не понимаю, когда лог на десяток мегабайт, как до последней ячейки достать...?
Ну то есть если у меня 10000 строк. как на всех них формулу размножить? Выделяю первую и листаю до посинения до 10000 строки?
Изменено: sin4ez - 29.07.2022 12:41:27
 
Цитата
sin4ez написал:
листаю до посинения до 10000 строки?
Но есть и хорошие новости :) У вас есть варианты на Power Query. Там ничего листать не нужно.
 
Цитата
sin4ez написал:
Выделяю первую и листаю до посинения до 10000 строки?
Не обязательно. Выделили ячейку с формулой, скопировали, выделили нужный для вставки диапазон в окошке слева от строки формул (там, где имена отражаются, прям так и пишете А1:А100500) и вставляете формулу. Если она правильно по синтаксису и адресации ячеек сделана - все пройдет штатно.
Другое дело, что на такие объемы PQ и вправду лучше.
Кому решение нужно - тот пример и рисует.
 
Вообще ТС не понял. Мой вариант из #3 не подходит что ли?
Подозреваю, что и лог у вас изначально в txt/csv. Грузите в PQ прямо оттуда, так быстрее будет и в числе строк нет ограничений.
Изменено: surkenny - 29.07.2022 14:36:41
Страницы: 1
Наверх