oguruma
XLDnaute Occasionnel
Bonjour, voici 3 méthodes pour splitter des colonnes
Méthode 1
Résultat
Méthode 1
Résultat
PowerQuery:
let
Tbl=fnGetParameter("TB_PARAMS_1","TBL","PARAM", "VALEUR"),
Cols=fnGetParameter("TB_PARAMS_1","COLONNE_SPLIT","PARAM", "VALEUR"),
Sep=fnGetParameter("TB_PARAMS_1","SEPARATEUR_SPLIT_1","PARAM", "VALEUR"),
Source = fnSplitMagicColumnsV1(Tbl, Cols, Sep, true)
in
Source
PowerQuery:
let fnSplitMagicColumnsV1 = (
pTableData as any,
pColumnToSplit as text,
optional pSeparator as text,
optional pChangeTypeColumns as logical
) as table =>
let
//=======================================================================================================
// Gestion des paramètres
//=======================================================================================================
TableData=if pTableData is null then false else pTableData,
ColumnToSplit=if pColumnToSplit is null then false else pColumnToSplit,
ChangeTypeColumns=if pChangeTypeColumns is null then false else pChangeTypeColumns,
Separator=if pSeparator is null then ";" else pSeparator,
//=======================================================================================================
// On accède à la table à traiter
//=======================================================================================================
Source = try
if TableData is text
then Excel.CurrentWorkbook(){[Name=TableData]}[Content]
else TableData
otherwise false,
//=======================================================================================================
// Traitement de la table à condition qu'elle existe
//=======================================================================================================
ToTableSplit= if Source is table then
let
SplitColumnsTitle=Text.Split(pColumnToSplit,Separator),
ChangeType = Table.TransformColumnTypes(Source,{{pColumnToSplit, type text}}),
SplitMagic = Table.SplitColumn(ChangeType, pColumnToSplit, Splitter.SplitTextByDelimiter(Separator, QuoteStyle.Csv), SplitColumnsTitle)
in
SplitMagic
else
"#Table " & pTableData & " inconnue"
in
ToTableSplit
in
fnSplitMagicColumnsV1
PowerQuery:
let
Tbl=fnGetParameter("TB_PARAMS_2","TBL","PARAM", "VALEUR"),
Cols=fnGetParameter("TB_PARAMS_2","COLONNE_SPLIT","PARAM", "VALEUR"),
Sep1=fnGetParameter("TB_PARAMS_2","SEPARATEUR_SPLIT_1","PARAM", "VALEUR"),
ListSep=fnGetParameter("TB_PARAMS_2","SEPARATEUR_VALEUR","PARAM", "VALEUR"),
Source = fnSplitMagicColumnsV2(Tbl, Cols, "-,/", Sep1, true)
in
Source
PowerQuery:
let fnSplitMagicColumnsV2 = (
pTableData as any,
pColumnsToSplit as text,
pListSep as text,
optional pSeparator_1 as text,
optional pChangeTypeColumns as logical
) =>
let
//=======================================================================================================
// Gestion des paramètres
//=======================================================================================================
TableData=if pTableData is null then false else pTableData,
ColumnsToSplit=if pColumnsToSplit is null then false else pColumnsToSplit,
Separator_1=if pSeparator_1 is null then "§" else pSeparator_1,
ChangeTypeColumns=if pChangeTypeColumns is null then false else pChangeTypeColumns,
// Les colonnes à traiter sont transformées en liste
ListColumnsToSplit=Text.Split(ColumnsToSplit,Separator_1),
// Nombre de colonnes à traiter
NbColumnsToSplit=List.Count(ListColumnsToSplit),
// Liste des séparateurs pour chaque colonne
//ListSep=Text.Split(pListSep,pSeparator_2),
ListSep=Text.ToList(pListSep),
//=======================================================================================================
// On accède à la table à traiter
//=======================================================================================================
Source = try
if TableData is text
then Excel.CurrentWorkbook(){[Name=TableData]}[Content]
else TableData
otherwise false,
//=======================================================================================================
// Traitement de la table à condition qu'elle existe
// On va boucler sur la liste des colonnes à splitter
//=======================================================================================================
ToTableSplit=
if Source is table then
let
// On va construire la table finale de manière itérative
GenerateSplit=List.Accumulate(
ListColumnsToSplit, // Liste des colonnes à traiter
Source, // On initialise l'accumulateur sur la source initiale
(state, current) =>
let
P=List.PositionOf(ListColumnsToSplit,current), // On recherche le séparateur de la colonne en cours de traitement
SplitColumnsTitle=Text.Split(current,ListSep{P}), // Le nom de la colonne transformé en liste
// Le traitement initial a lieu sur l'accumulateur pour la modification du type
ChangeType = if ChangeTypeColumns then Table.TransformColumnTypes(state,{{current, type text}}) else state, // On force le type texte
// Eclatement de la colonne en cours dans la variable current - l'accumulateur est automatiquement mise à jour
SplitMagic = Table.SplitColumn(ChangeType, current, Splitter.SplitTextByDelimiter(ListSep{P}, QuoteStyle.Csv), SplitColumnsTitle)
in
SplitMagic
)
in
GenerateSplit
else
"#Table " & pTableData & " inconnue"
in
ToTableSplit
in
fnSplitMagicColumnsV2
PowerQuery:
let
Tbl=fnGetParameter("TB_PARAMS_3","TBL","PARAM", "VALEUR"),
Cols=fnGetParameter("TB_PARAMS_3","COLONNE_SPLIT","PARAM", "VALEUR"),
ColsTitle=fnGetParameter("TB_PARAMS_3","COLONNE_TITRE","PARAM", "VALEUR"),
Sep1=fnGetParameter("TB_PARAMS_3","SEPARATEUR_SPLIT_1","PARAM", "VALEUR"),
Sep2=fnGetParameter("TB_PARAMS_3","SEPARATEUR_SPLIT_2","PARAM", "VALEUR"),
ListSep=fnGetParameter("TB_PARAMS_3","SEPARATEUR_VALEUR","PARAM", "VALEUR"),
Source = fnSplitMagicColumnsV3(Tbl, Cols, ColsTitle, "-,/", Sep1, Sep2, true)
in
Source
PowerQuery:
let fnSplitMagicColumnsV3 = (
pTableData as any,
pColumnsToSplit as text,
pColumnsTitles as text,
pListSep as text,
optional pSeparator_1 as text,
optional pSeparator_2 as text,
optional pChangeTypeColumns as logical
) =>
let
//=======================================================================================================
// Gestion des paramètres
//=======================================================================================================
TableData=if pTableData is null then false else pTableData,
ColumnsToSplit=if pColumnsToSplit is null then false else pColumnsToSplit,
ChangeTypeColumns=if pChangeTypeColumns is null then false else pChangeTypeColumns,
Separator_1=if pSeparator_1 is null then "§" else pSeparator_1,
Separator_2=if pSeparator_1 is null then "-" else pSeparator_2,
ColumnsTitles=pColumnsTitles,
// Les colonnes à traiter sont transformées en liste
ListColumnsToSplit=Text.Split(ColumnsToSplit,Separator_1),
ListColumnsTitles=Text.Split(ColumnsTitles,Separator_1),
ListSep=Text.ToList(pListSep),
// Nombre de colonnes à traiter
NbColumnsToSplit=List.Count(ListColumnsToSplit),
NbColumnsTitles=List.Count(ListColumnsTitles),
//=======================================================================================================
// On accède à la table à traiter
//=======================================================================================================
Source = try
if TableData is text
then Excel.CurrentWorkbook(){[Name=TableData]}[Content]
else TableData
otherwise false,
//=======================================================================================================
// Traitement de la table à condition qu'elle existe
// On va boucler sur la liste des colonnes à splitter
//=======================================================================================================
ToTableSplit=
if Source is table then
let
// On va construire la table finale de manière itérative
GenerateSplit=List.Accumulate(
ListColumnsToSplit, // Liste des colonnes à traiter
Source, // On initialise l'accumulateur sur la source initiale
(state, current) =>
let
P=List.PositionOf(ListColumnsToSplit,current), // On recherche le séparateur de la colonne en cours de traitement
SplitColumnsTitle=Text.Split(ListColumnsTitles{P},Separator_2), // Le nom de la colonne transformé en liste
// Le traitement initial a lieu sur l'accumulateur pour la modification du type
ChangeType = if ChangeTypeColumns then Table.TransformColumnTypes(state,{{current, type text}}) else state, // On force le type texte
// Eclatement de la colonne en cours dans la variable current - l'accumulateur est automatiquement mise à jour
SplitMagic = Table.SplitColumn(ChangeType, current, Splitter.SplitTextByDelimiter(ListSep{P}, QuoteStyle.Csv), SplitColumnsTitle)
in
SplitMagic
)
in
GenerateSplit
else
"#Table " & pTableData & " inconnue"
in
ToTableSplit
in
fnSplitMagicColumnsV3
PowerQuery:
let fnGetParameter =
(
pTable as any,
pName as text,
optional pParam as text,
optional pVal as text
) =>
let
ParamSource = if pTable is text then
Excel.CurrentWorkbook(){[Name=pTable]}[Content]
else pTable,
Parametre = if pParam <> null then
pParam
else "PARAMETRE",
Valeur = if pVal <> null then
pVal
else "VALEUR",
StrParam="each ([" & Parametre & "]) = " & """" & pName & """",
EvalParam=Expression.Evaluate(StrParam,[ParamSource=ParamSource]),
ParamRow = Table.SelectRows(ParamSource, EvalParam),
Value= if Table.IsEmpty(ParamRow)=true
then null
else Record.Field(ParamRow{0},Valeur)
in
Value
in
fnGetParameter