PQ - combiner 2 premieres lignes => Header

Bonjour à tous,

En utilisant l'interface PQ j'ai réalisé cette requête que je trouve assez longue pour simplement utiliser mes 2 premières lignes comme en-tête, y-a-t-il moyen d'aller un peu plus vite ?

let
    Source = Csv.Document(File.Contents("...\node loads.tsv"),[Delimiter="    ", Columns=7, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Column1", type text}, {"Column2", type text}, {"Column3", type text}, {"Column4", type text}, {"Column5", type text}, {"Column6", type text}, {"Column7", type text}}),
    #"Transposed Table" = Table.Transpose(#"Changed Type"),
    #"Inserted Merged Column" = Table.AddColumn(#"Transposed Table", "Merged", each Text.Combine({[Column1], [Column2]}, " "), type text),
    #"Reordered Columns" = Table.ReorderColumns(#"Inserted Merged Column",{"Merged", "Column1", "Column2", "Column3", "Column4", "Column5", "Column6", "Column7", "Column8", "Column9", "Column10", "Column11", "Column12", "Column13", "Column14", "Column15", "Column16", "Column17", "Column18", "Column19", "Column20", "Column21", "Column22", "Column23", "Column24", "Column25", "Column26", "Column27", "Column28", "Column29", "Column30", "Column31", "Column32", "Column33", "Column34", "Column35", "Column36", "Column37", "Column38", "Column39", "Column40", "Column41", "Column42", "Column43", "Column44", "Column45", "Column46", "Column47", "Column48", "Column49", "Column50", "Column51", "Column52", "Column53", "Column54", "Column55", "Column56", "Column57", "Column58", "Column59", "Column60", "Column61", "Column62", "Column63", "Column64", "Column65", "Column66", "Column67", "Column68", "Column69", "Column70", "Column71", "Column72", "Column73", "Column74", "Column75", "Column76", "Column77", "Column78", "Column79", "Column80", "Column81", "Column82", "Column83", "Column84", "Column85", "Column86", "Column87", "Column88", "Column89", "Column90", "Column91", "Column92", "Column93", "Column94", "Column95", "Column96", "Column97", "Column98", "Column99", "Column100", "Column101", "Column102", "Column103", "Column104", "Column105", "Column106", "Column107", "Column108", "Column109", "Column110", "Column111", "Column112", "Column113", "Column114", "Column115", "Column116", "Column117", "Column118", "Column119", "Column120", "Column121", "Column122", "Column123", "Column124", "Column125", "Column126", "Column127", "Column128", "Column129", "Column130", "Column131", "Column132", "Column133", "Column134", "Column135", "Column136", "Column137", "Column138", "Column139", "Column140", "Column141", "Column142", "Column143", "Column144", "Column145", "Column146", "Column147", "Column148", "Column149", "Column150", "Column151", "Column152", "Column153", "Column154", "Column155", "Column156", "Column157", "Column158", "Column159", "Column160", "Column161", "Column162", "Column163", "Column164", "Column165", "Column166", "Column167", "Column168", "Column169", "Column170", "Column171", "Column172", "Column173", "Column174", "Column175", "Column176", "Column177", "Column178", "Column179", "Column180", "Column181", "Column182", "Column183", "Column184", "Column185", "Column186", "Column187", "Column188", "Column189", "Column190", "Column191", "Column192", "Column193", "Column194", "Column195", "Column196", "Column197", "Column198", "Column199", "Column200", "Column201", "Column202", "Column203", "Column204", "Column205", "Column206", "Column207", "Column208", "Column209", "Column210", "Column211", "Column212", "Column213", "Column214", "Column215", "Column216", "Column217", "Column218", "Column219", "Column220", "Column221", "Column222", "Column223", "Column224", "Column225", "Column226", "Column227", "Column228", "Column229", "Column230", "Column231", "Column232", "Column233", "Column234", "Column235", "Column236", "Column237", "Column238", "Column239", "Column240", "Column241", "Column242", "Column243", "Column244", "Column245", "Column246", "Column247", "Column248", "Column249", "Column250", "Column251", "Column252", "Column253", "Column254", "Column255", "Column256", "Column257", "Column258", "Column259", "Column260", "Column261", "Column262", "Column263", "Column264", "Column265", "Column266", "Column267", "Column268", "Column269", "Column270", "Column271", "Column272", "Column273", "Column274", "Column275", "Column276", "Column277", "Column278", "Column279", "Column280", "Column281", "Column282", "Column283", "Column284", "Column285", "Column286", "Column287", "Column288", "Column289", "Column290"}),
    #"Removed Columns" = Table.RemoveColumns(#"Reordered Columns",{"Column1", "Column2"}),
    #"Transposed Table1" = Table.Transpose(#"Removed Columns"),
    #"Promoted Headers" = Table.PromoteHeaders(#"Transposed Table1", [PromoteAllScalars=true]),
    #"Changed Type1" = Table.TransformColumnTypes(#"Promoted Headers",{{" ", type text}, {"FX (N)", Int64.Type}, {"FY (N)", Int64.Type}, {"FZ (N)", Int64.Type}, {"MX (N.mm)", Int64.Type}, {"MY (N.mm)", Int64.Type}, {"MZ (N.mm)", Int64.Type}})
in
    #"Changed Type1"

Ci-joint données sources. (TSV = Tab separated values converti en TXT pour upload sur le forum)

10node-loads.txt (25.73 Ko)

Hello,

Un essai (mais sans utiliser exclusivement l'interface...)

let
    Source = Csv.Document(File.Contents("D:\doc\Excel\exemples\PQ\csv\txt\node-loads.txt"),[Delimiter="#(tab)", Columns=7, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    Titres = List.Transform(Table.ToColumns(Table.FirstN(Source,2)), each Text.Combine(_," ")),
    Rename = Table.RenameColumns(Table.Skip(Source,2),List.Zip({Table.ColumnNames(Source),Titres})),
    SupprPoint = Table.ReplaceValue(Rename,".","",Replacer.ReplaceText,{"FZ (N)"}),
    TypeNumber = Table.TransformColumnTypes(SupprPoint, List.Transform(List.Skip(Titres,1), each {_, type number}))
in
    TypeNumber

Bonne fin d'apm

(PS, attention, le séparateur "Tabulation" ne semble pas identique entre Fr et En) -> remplacé " " par "#(tab)"

Bonjour à tous ! (mention spéciale pour les fous furieux de Power Query....)

Une approche, différente à la marge ( notamment via l'insertion d'enregistrement) :

let
    Source = Csv.Document(File.Contents("E:\USB\_TEMP\Saboh12617\node-loads.txt"),[Delimiter="    ", Columns=7, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    ET = Record.FromList(
            List.Transform(
                Table.ToColumns(Table.FirstN(Source,2)),
                each if _{0}="" then "Column1" else Text.Combine(_," ")),
                Table.ColumnNames(Source)
                ),
    Insertion_ET = Table.InsertRows( 
                Table.Skip(Source,2),
                0,
                {ET}
                ),
    ET_Promus = Table.PromoteHeaders(Insertion_ET, [PromoteAllScalars=true])
in
ET_Promus

Wow les gars bravo comme d'habitude c'est vraiment top. Je me doutais que la double transposition n'était pas terrible…

A ce compte-là, si vous avez un peu de temps j'aimerai effectuer le traitement suivant (pour l'instant je le fais via formules, mais l'intégrer dans PQ) ce serait top :

Supprimer les colonnes MX,MY,MZ

[col1] Extraire le numéro après "Node" et avant ":" (j'utilise le regex (?<=Node\s)\d+(?=:))

[col2+3] C'est ce qui me pose le plus de problème en PQ : à partir du TS "tblNodesPos" de mon fichier, extraire son "PosID" et son "en-tete de colonne". Le tableau se présente ainsi :

Position

PosID

LW 0

LW +56

LW -10

FM 0

FM +25

PK

Back LeftBL5768821188149418002106
Back RightBR5748801186149217982104
Front LeftFL5788841190149618022108
Front RightFR5808861192149818042110

Donc pour le node 576 : 1 colonne qui contient "BL" et une "LW 0".

[col4] Extraire le nombre de "I" après "CASE" (va de I à III) => 1,2,3. J'utilise la formule

=ARABE(REGEX.EXTRAIRE(node_loads[LC];"(?<=CASE\s)I+"))

[col5] Extraire le texte après "CASE I" et avant "[", j'utilise le regex (?<=CASE\s(?:I|II|III)\s:\s)(.*?)(?=\s*\[).

Si ça peut aider, ci-joint le fichier avec la proposition de @cousinhub, car @JFL ça fonctionne nickel mais je perds la conversion des types. J'ai essayé de l'ajouter mais cela n'a pas fonctionné. Un exemple avec mes formules actuelles est proposé.

merci beaucoup pour votre aide.

8book1.xlsx (38.86 Ko)

EDIT : demande secondaire résolue, Query finale :

let
    Source = Csv.Document(File.Contents("....\node loads.tsv"),[Delimiter="    ", Columns=7, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    // titles
    Titres = List.Transform(Table.ToColumns(Table.FirstN(Source,2)), each Text.Combine(_," ")),
    Rename = Table.RenameColumns(Table.Skip(Source,2),List.Zip({Table.ColumnNames(Source),Titres})),
    SupprPoint = Table.ReplaceValue(Rename,".","",Replacer.ReplaceText,{"FZ (N)"}),
    TypeNumber = Table.TransformColumnTypes(SupprPoint, List.Transform(List.Skip(Titres,1), each {_, type number})),

    // simple extraction
    #"Renamed Columns" = Table.RenameColumns(TypeNumber,{{" ", "LC"}}),
    #"Added Custom" = Table.AddColumn(#"Renamed Columns", "Node", each Number.FromText(Text.BeforeDelimiter(Text.AfterDelimiter([LC], "Node "), ":"))),
    #"Added Custom1" = Table.AddColumn(#"Added Custom", "Load Case", each Text.Length(Text.BeforeDelimiter(Text.AfterDelimiter([LC], "CASE "), " :"))),
    #"Added Custom2" = Table.AddColumn(#"Added Custom1", "LC Name", each Text.BeforeDelimiter(Text.AfterDelimiter([LC], " : "), "[")),
    #"Removed Columns" = Table.RemoveColumns(#"Added Custom2",{"MX (N.mm)", "MY (N.mm)", "MZ (N.mm)"}),

    // lookup on other table
    tblNodesPos = Excel.CurrentWorkbook(){[Name="tblNodesPos"]}[Content],
    tblNodesPosLong = Table.UnpivotOtherColumns(tblNodesPos, {"Position", "PosID"}, "LoadCase", "Node"),
    tblNodesPosLongRenamed = Table.RenameColumns(tblNodesPosLong, {{"Node", "NodePos"}}),
    merged = Table.Join(#"Removed Columns", "Node", tblNodesPosLongRenamed, "NodePos", JoinKind.LeftOuter),

    // output
    renamedFinal = Table.RenameColumns(merged, {{"LoadCase", "Group"}}),
    final = Table.SelectColumns(renamedFinal, {"Node", "PosID", "Group", "LC", "LC Name", "FX (N)", "FY (N)", "FZ (N)"})

in
    final

Merci beaucoup à vous 2, bonne journée

Hello,

Je reviens sur ma petite observation, concernant le délimiteur.
Si je copie le code inséré dans ta dernière réponse, le "split" ne se fait pas, il considère le
[Delimiter="    ",
comme une série d'espaces, et non une tabulation.
En testant avec le fichier, cela fonctionne.
Je pense que l'éditeur de code du forum interprète mal le caractère "tabulation", et qu'il vaut mieux privilégier "#(tab)" lorsqu'on colle un code dans une réponse.
PS, pour extraire les caractères, lors de l'ajout des 3 colonnes, tu peux utiliser directement "Text.BetweenDelimiter"
Bonne fin d'apm

Ah oui je n'avais pas fait attention, puisque c'est séparé par des tabulations le #(tab) est en effet bien plus adapté.

Merci pour la fonction de découpe texte, il y a tellement de possibilités...

Bonjour,

Ah oui je n'avais pas fait attention, puisque c'est séparé par des tabulations le #(tab) est en effet bien plus adapté.

Tu n'y peux rien, c'est l'éditeur avancé de PQ qui sort ce code. Donc, dans ton fichier, cela va fonctionner.
C'est juste le C/C du code dans l'éditeur de code du forum qui transforme la tabulation en 4 espaces (car 32), donc rien de bien méchant, juste une vigilance

Bonne journée

Rechercher des sujets similaires à "combiner premieres lignes header"