Variabler Spaltenname
#1
Hallo Zusammen 

ich bräuchte mal ne gedankliche Hilfestellung. 

Beim laden verschiedener CSVen kann es sein, das Spaltenüberschriften variieren. 
gibt es die Mögllichkeit in PQ das zu flexibilisieren? 

also das ich händsich eine Liste / Formel erstelle die sich dann wahlweise anwendet. 

Also die Spalte soll zB "Boot" heissen (und so ist sie auch bei vielen hinterlegt)
jetzt gibt es aber Dateien wo "U-Boot" steht oder "BOOT" 

PQ soll dann im die Spalte neu benamsen wenn sie anders heisst. 
so in der Art.: 

If(Spaltenname = "U-Boot" or Spaltenname = "BOOT" then RenameSpalte) 

Und das idealerweise vielleicht auch innerhalb der bestehenden Spalte und nicht mit Spalten hinzufügen und löschen


iCh freu micha uf eure Ideen 

Grüße JAck


Edith hat schon eine mögliche Lösung 

Code:
// Tab Bereinigen
    Titel_Down = Table.DemoteHeaders(Expand_Tab),
    TransposeTable_UpsideLeft = Table.Transpose(Titel_Down),
   
    //Spaltenname korrigieren
    ReplaceVal_Spaltenname = Table.ReplaceValue(TransposeTable_UpsideLeft,"U-Boot","Boot",Replacer.ReplaceText,{"Column1"}),   
   
    Filter_EmptyCol = Table.SelectRows(ReplaceVal_Spaltenname, each not Text.Contains([Column1], "_")),
    TransposeTable_LeftUpside = Table.Transpose(Filter_EmptyCol),
    Titel_Up = Table.PromoteHeaders(TransposeTable_LeftUpside, [PromoteAllScalars=true]),
Antworten Top
#2
Hi,

das Einfachste wäre es, die Spaltenüberschriften nicht mit Table.PromoteHeaders() nach oben zu holen, sondern die Spalten selbst zu benennen und dann die erste Zeile (die mit den Überschriften) zu löschen. Das funktioniert natürlich nur, wenn die Spalten immer in derselben Reihenfolge kommen.


Ansonsten müsste auch so was wie
Code:
=Table.RenameColumns(#"Dein vorheriger Schritt", List.Transform( Table.ColumnNames(#"Dein vorheriger Schritt"), each {_, Text.Replace(_, "U-BOOT", "Boot")} ))
funktionieren. Wobei du #"Dein vorheriger Schritt" durch den Namen deines zuletzt verwendeten Schrittes ersetzen musst. Für weitere Werte außer "U-BOOT" brauchst du natürlich jeweils einen weiteren Schritt. Wobei du das auch für jede erdenkliche Groß-/Kleinschreibung machen musst.

Vielleicht hat ja jemand noch eine bessere Idee.
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#3
Hallo Helmut

Danke für deinen INPUT!

Zitat:Das funktioniert natürlich nur, wenn die Spalten immer in derselben Reihenfolge kommen.
Das ist genau das Problem.. 

Zitat:Für weitere Werte außer "U-BOOT" brauchst du natürlich jeweils einen weiteren Schritt. Wobei du das auch für jede erdenkliche Groß-/Kleinschreibung machen musst.
Ja, das hab ich bald befürchtet. Eine Liste wäre hier ganz nett 

Grüße Jack
Antworten Top
#4
Du kannst vermutlich auch die Import-Header einfach generell ignorieren und einen eigenen Header erstellen.
Antworten Top
#5
Das ist das, was ich mit meinem ersten Satz beschrieben habe Angel
Gruß,
Helmut

Win10 - Office365 / MacOS - Office365
Antworten Top
#6
Moin WS53 

wie meinst du das? 
Ansonsten hat Helmut ja schon gesagt - müssten die Spalten in ihrer Position identisch sein 

VG Jack
Antworten Top
#7
(28.10.2025, 14:42)Jack_d schrieb: Ja, das hab ich bald befürchtet. Eine Liste wäre hier ganz nett 
Sagen wir mal Deine CSV hat die Spalten "Nr;uboot" und Du willst nur "uboot" aber das als "U-Boot".

Table.RenameColumns sollte klar sein, dem Ding über gibst Du eine List of List mit jeweils {"alt", "neu"}.
https://learn.microsoft.com/de-at/powerq...amecolumns

Mach eine Parametertabelle mit altem und neuem Überschriften, jede Spalte ist eine Liste und dann ersetzt Du die Spalten via
List.ReplaceMatchingItems
https://learn.microsoft.com/de-at/powerq...chingitems

Alles klar?

.zip   test.zip (Größe: 15,41 KB / Downloads: 4)

Andreas.

Code:
// test
let
    Source = Csv.Document(File.Contents("Z:\test.csv"),[Delimiter=";", Columns=2, Encoding=1252, QuoteStyle=QuoteStyle.None]),
    #"Promoted Headers" = Table.PromoteHeaders(Source, [PromoteAllScalars=true]),
    Custom1 = fnRemoveRenameColumns(#"Promoted Headers", "Parameter")
in
    Custom1

// fnRemoveRenameColumns
let
  fnRemoveRenameColumns = (Source as table, ParameterTable as text, optional OldHeaders as text, optional NewHeaders as text) =>
    let
      // Prepare
      PT = Excel.CurrentWorkbook(){[Name = ParameterTable]}[Content],
      OH = if OldHeaders = null then Table.ColumnNames(PT){0} else OldHeaders,
      NH = if NewHeaders = null then Table.ColumnNames(PT){1} else NewHeaders,
      // Find the columns to be removed
      rParaTable = Table.SelectRows(PT, each (Record.Field(_, NH) = null) or (Record.Field(_, NH) = "")),
      rOldHeaders = Table.Column(rParaTable, OH),
      // Which one exists in source?
      rRemoveHeaders = List.Intersect({Table.ColumnNames(Source), rOldHeaders}),
      rSource = Table.RemoveColumns(Source, rRemoveHeaders),
      // Find the columns to be renamed
      kParaTable = Table.SelectRows(PT, each (Record.Field(_, NH) <> null) and (Record.Field(_, NH) <> "")),
      kOldHeaders = Table.Column(kParaTable, OH),
      kNewHeaders = Table.Column(kParaTable, NH),
      // Which one exists in source?
      rColumnNames = Table.ColumnNames(rSource),
      kColumnNames = List.ReplaceMatchingItems(rColumnNames, List.Zip({kOldHeaders, kNewHeaders}), Comparer.OrdinalIgnoreCase),
      kSource = Table.RenameColumns(rSource, List.Zip({rColumnNames, kColumnNames})),
      // Reorder
      oColumnNames = Table.ColumnNames(kSource),
      oNewHeaders = List.Intersect({kNewHeaders, oColumnNames}),
      Result = Table.ReorderColumns(kSource, oNewHeaders)
    in
      Result
,
documentation = [
  Documentation.Name =  "fnRemoveRenameColumns",
  Documentation.Description = "Removes, renames and reorders the columns of a table from a setup table",
  Documentation.LongDescription = Documentation.Description,
  Documentation.Category = "Table",
  Documentation.Source = "andreas.killer@gmx.net",
  Documentation.Version = "1.1",
  Documentation.Author = "Andreas Killer",
  Documentation.Examples = {[
    Description = "",
    Code = "
Source         : The source table to be modified
ParameterTable : Name of the parameter table in Excel
ParameterName  : Text to be found in the ParameterColumn
OldHeaders     : Name of the column containing the old headers (in the source table) (1st column if omitted)
NewHeaders     : Name of the column containing the new headers (aligned row by row)  (2nd column if omitted)

If the row in NewHeaders is blank the specified column in OldHeaders is removed from the table.
Otherwise the column is renamed if found.
",
    Result = ""]}]
in 
  Value.ReplaceType(fnRemoveRenameColumns, Value.ReplaceMetadata(Value.Type(fnRemoveRenameColumns), documentation))
Antworten Top
#8
Hallo Andreas, 

das ist toll! Ich habs glaub auch verstanden und versuch mich an der Anpassung =) 

Danke!


VG JAck
Antworten Top
#9
oder man ändert die CSV-Dateien:


Code:
With CreateObject("scripting.filesystemobject")
   .createtextfile("D:\OF\beispiel.csv").write Replace(Replace(.OpenTextFile("D:\OF\Beispiel.csv").ReadAll, "U-Boot", "Boot"), "BOOT", "Boot")
End With
Zum übersetzen von Excel Formeln:

http://dolf.trieschnigg.nl/excel/index.p...gids=en+de
Antworten Top
#10
Moin SNB

hatte ich auch drüber nachgedacht. ICh hatte jedoch vor geraumer Zeit genau damit mal Probleme.
In manchen Dateien ist ein Datum mit Uhrzeit drin. 

im Format: YYYYMMDDHHMMSS
und beim bearbeiten der CSV hat es mir jedes mal dieses Datum zerschossen und die Zeiten auf 0:00 gesetzt. 
Daher bin ich davon abgekommen.

Gab dazu im MOF auch nen recht langen Thread 

Grüße Jack
Antworten Top


Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste