Транспонировать данные на основе правильного шаблона

Вот как я хочу, чтобы дата выглядела, когда все будет сделано, и я перенесу данные.

Транспонировать данные на основе правильного шаблона

Данные

2 Witches Winery and Brewing Company
209 Trade Street
Danville, VA 24541-3545
Phone: (434) 549-2739
Type: Taproom
www.2witcheswinebrew.com
View Map

36 Fifty Brewing
120 N Chestnut St
Marion, VA 24354
Type: Taproom
View Map

6 Bears & A Goat Brewing Company, LLC
1140 International Pkwy
Fredericksburg, VA 22406-1126
Phone: 540-356-9056 Ext. 2
Type: Brewpub
www.6bgbrewingco.com
View Map

Каждый блок ячеек представляет ОДНУ пивоварню. Я пытаюсь транспонировать и поместить это значение в строки. Вот проблема…. Не все значения находятся в правильном месте. Первые 3 строки всегда одинаковы для каждой пивоварни. Когда дело доходит до 4-го ряда каждой пивоварни, тут все становится сложнее. Не на всех пивоварнях есть телефоны, поэтому перенос данных приводит к тому, что все данные оказываются не в том месте. Обычно тип должен находиться в строке «5», но, поскольку числа нет, он находится в 4-й строке. Примерно 20% данных таковы. У кого какие рекомендации.

Извините, редактировать забыл добавить то, что я пробовал, но это не работает должным образом.

// Table2
let
    Source = Excel.CurrentWorkbook(){[Name = "Table2"]}[Content],
    #"Added Custom" = Table.AddColumn(Source, "Helper_Column", each if Text.Contains([Column1],"Phone:") then "1 @1" else null),
    #"Removed Errors" = Table.RemoveRowsWithErrors(#"Added Custom", {"Helper_Column"}),
    #"Split Column by Delimiter" = Table.ExpandListColumn(Table.TransformColumns(#"Removed Errors", {{"Helper_Column", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Helper_Column"),
    #"Added Custom1" = Table.AddColumn(#"Split Column by Delimiter", "Helper Column 1", each if [Helper_Column] = "@1" then null else [Column1]),
    #"Removed Other Columns" = Table.SelectColumns(#"Added Custom1",{"Helper Column 1"}),
    #"Added Custom2" = Table.AddColumn(#"Removed Other Columns", "Helper Column", each if Text.Contains([Helper Column 1],"View Map") then "1 @1" else null),
    #"Replaced Errors" = Table.ReplaceErrorValues(#"Added Custom2", {{"Helper Column", null}}),
    #"Split Column by Delimiter1" = Table.ExpandListColumn(Table.TransformColumns(#"Replaced Errors", {{"Helper Column", Splitter.SplitTextByDelimiter(" ", QuoteStyle.Csv), let itemType = (type nullable text) meta [Serialized.Text = true] in type {itemType}}}), "Helper Column"),
    #"Added Custom3" = Table.AddColumn(#"Split Column by Delimiter1", "Helper", each if [Helper Column] = "@1" then null else [Helper Column 1]),
    #"Removed Other Columns1" = Table.SelectColumns(#"Added Custom3",{"Helper"}),
    #"Added Index" = Table.AddIndexColumn(#"Removed Other Columns1", "Index", 0, 1, Int64.Type),
    #"Inserted Modulo" = Table.AddColumn(#"Added Index", "Modulo", each Number.Mod([Index], 8), type number),
    #"Integer-Divided Column" = Table.TransformColumns(#"Inserted Modulo", {{"Index", each Number.IntegerDivide(_, 8), Int64.Type}}),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Integer-Divided Column", {{"Modulo", type text}}, "en-IN"), List.Distinct(Table.TransformColumnTypes(#"Integer-Divided Column", {{"Modulo", type text}}, "en-IN")[Modulo]), "Modulo", "Helper")
in
    #"Pivoted Column"

Нет хорошего способа сделать это, тем более что вы также, вероятно, найдете элементы с трехстрочными адресами. Лучше всего повернуть его, а затем добавить настраиваемые столбцы для поиска по слову «телефон», «тип» и «www».

horseyride 09.04.2022 00:56
Преобразование HTML-таблицы в профессиональный документ Excel
Преобразование HTML-таблицы в профессиональный документ Excel
Это самый простой способ создания Excel из HTML-таблицы.
Импорт excel в laravel в базу данных
Импорт excel в laravel в базу данных
Здравствуйте, дорогой читатель, в этой статье я расскажу практическим и быстрым способом, как импортировать файл Excel в вашу базу данных с помощью...
2
1
38
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это зависит от того, насколько реалистичен ваш пример. Но код ниже может помочь. Он работает с вашими опубликованными данными.

Но у вас должны быть недвусмысленные правила.

Я получил некоторые из ваших данных и того, что вы написали, и отметил их в комментариях к коду. Конечно, если ваши фактические данные не соответствуют этим правилам, алгоритм не будет работать. И если это так, вам придется изменить правила.

let
    Source = Excel.CurrentWorkbook(){[Name = "Table1"]}[Content],
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}}),

//assuming each group is contiguous lines
// with a blank line inbetween each group
// the below few lines will create a column on which to group
// then remove the "blank line between"
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1, Int64.Type),
    #"Added Custom" = Table.AddColumn(#"Added Index", "group", each if [Column1] = null then [Index] else null, Int64.Type),
    #"Filled Up" = Table.FillUp(#"Added Custom",{"group"}),
    #"Removed Columns" = Table.RemoveColumns(#"Filled Up",{"Index"}),
    #"Filtered Rows" = Table.SelectRows(#"Removed Columns", each ([Column1] <> null)),

//Group, then extract the data
    #"Grouped Rows" = Table.Group(#"Filtered Rows", {"group"}, {

//Line one is always the brewery name
        {"Brewery Name", each [Column1]{0}, type text},

//Lines 2 and 3 are always the address
        {"Address Part 1", each [Column1]{1}, type text},
        {"Address Part 2", each [Column1]{2}, type text},

//Phone number starts with "Phone:"
        {"Phone", each List.Accumulate([Column1], "", (state, current)=> 
            if Text.StartsWith(current,"Phone:") then state & current else state), type text},

//Type starts with "Type:"
        {"Type", each List.Accumulate([Column1], "", (state, current)=> 
            if Text.StartsWith(current,"Type:") then state & current else state), type text},

//Other 1 starts with "www."
        {"Other 1", each List.Accumulate([Column1], "", (state, current)=> 
            if Text.StartsWith(current,"www.") then state & current else state), type text},

//Other 2 is the last line
        {"Other 2", each List.Last([Column1]), type text}
        }),

//Remove the grouper column
    #"Removed Columns1" = Table.RemoveColumns(#"Grouped Rows",{"group"})
in
    #"Removed Columns1"

Данные

Полученные результаты

Боже мой....это так прекрасно. Блестяще, сработало для меня. без каких-либо изменений.

Charles Wilkinson 09.04.2022 18:02

Другие вопросы по теме