如何在Power BI中使用循环重命名标头?

时间:2018-06-15 10:54:25

标签: powerbi powerquery m

我有一种情况需要根据具有旧名称(HeadersTranslated [HeaderList]),新名称(HeadersTranslated [HeaderEnglish])和indeks编号(HeadersTranslated [Indeks])的表重命名标题。

因此,我试图遍历indeks数字,并为每个数字进行重命名。

但是我似乎无法让它一次超过1列(将StartTheLoop(HeadersTranslated[Indeks])替换为StartTheLoop(0),例如在下面:

let
   Source = Data_Cyrillic,
   #"Promoted Headers" = Table.PromoteHeaders(Source,[PromoteAllScalars=true]),
   #"Changed Type" = Table.TransformColumnTypes(#"Promoted Headers",{{"Column1", type number}, ... , {"Column52", type number}}),

   StartTheLoop = (MyCounter)=>

   let     
       #"Renamed Columns" = Table.RenameColumns(#"Changed Type",{{HeadersTranslated[HeaderList]{MyCounter}, HeadersTranslated[HeaderEnglish]{MyCounter}}})
   in
       #"Renamed Columns"
in
   StartTheLoop(HeadersTranslated[Indeks])

2 个答案:

答案 0 :(得分:2)

这并没有使用循环或索引,但我相信它可以解决您真正关注的问题。

如果我从包含我要重命名的列的表开始 - 我将其称为Table1:

enter image description here

这是我的表格,包含我要使用的新列名列表 - 我将此表称为NewColumnNames:

enter image description here

然后,在Table1中工作,我可以双击第一列标题并将其重命名为任何内容 - 我将输入Test:

enter image description here

然后,在公式栏中,替换这个突出显示的部分,这是一个列名称I' m替换(" Column1")和名称I' m替换它("试验&#34)...

enter image description here

...与List.Zip({Table.ColumnNames(Source),NewColumnNames[NewColumnNames]})。此更改将使用NewColumnNames表中NewColumnNames列表(列)中的列名替换所有原始列名。

enter image description here

List.Zip函数拉链,就像拉链(不像文件压缩器)。它将列表项编织在一起,就像拉链的牙齿一样。在这种情况下,它采用第一列名称," Column1" (它从函数Table.ColumnNames(Source)派生的列表中拉出),然后是第一个NewColumnName," New Column1" (它从表格列NewColumnNames[NewColumnNames]中提取)并将它们放入新列表中。然后它移动到第二列名称,然后移动到第二个NewColumnName,依此类推以创建列表列表。它创建的列表基本上是:{{"Column1", "New Column1"}, {"Column2", "New Column2"}, {"Column3", "New Column3"}, {"Column4", "New Column4"}}

答案 1 :(得分:0)

更一般而言,如果您希望Table1替换Table2的列标题,则可以使用此代码。在此版本中,Table1和Table2列标题之间的行顺序不必匹配,并且Table1中的每一行都不需要有相应的匹配项,因此您可以预先填充可能不需要的列标题替换< / p>

public class StringCharPlaceChanger {

    public static void main(String[] args) {

        String input = "AAA BB";
        System.out.println("Input: " + input);
        System.out.println();

        String result = stringCharPlaceChanger(input);

        System.out.println();
        System.out.println("Output: " + result);

    }

    public static String stringCharPlaceChanger(String stringToChange) {

        // input can not be null
        if (stringToChange == null) {
            System.out.println("Error: string can not be null");
            return null;
        }

        // index of space
        int x = stringToChange.indexOf(" ");

        // a space is required
        if (x == -1) {
            System.out.println("Error: no space found");
            return null;
        }

        // input converted in array
        char[] c = stringToChange.toCharArray();

        // number of chars on the left
        int numberOfLeft = x;

        // number of chars on the right
        int numberOfRight = c.length - x - 1;

        // length of the input
        int l = c.length;

        boolean first = true;

        // print of the original input
        System.out.println(stringToChange);

        while (numberOfRight > 0) {

            // after the first cycle
            if (!first) {
                // reset the position of the space near the next number to move 
                x = goTo(c, x, l - numberOfRight - 1);
            }
            else {
                first = false;
            }

            // move a char from right to left
            // basic algorithm:
            // a_b
            // ab_
            // _ba
            // b_a

            // a_b -> ab_
            x = swap(c, x, x + 1);
            for (int left = numberOfLeft; left > 0; left--) {
                // ab_ -> _ba
                x = swap(c, x, x - 2);
                // _ba -> b_a
                x = swap(c, x, x + 1);
            }

            numberOfRight--;

        }

        return new String(c);
    }

    // swap 2 chars
    private static int swap(char[] c, int i, int j) {
        char temp = c[i];
        c[i] = c[j];
        c[j] = temp;
        System.out.println(c);
        return j;
    }

    // go from left to right swapping chars
    private static int goTo(char[] c, int i, int j) {
        while (i < j) {
            if (i == j - 1) {
                i = swap(c, i, i + 1);
            }
            else {
                i = swap(c, i, i + 2);
            }
        }
        return j;
    }

}