我有一种情况需要根据具有旧名称(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])
答案 0 :(得分:2)
这并没有使用循环或索引,但我相信它可以解决您真正关注的问题。
如果我从包含我要重命名的列的表开始 - 我将其称为Table1:
这是我的表格,包含我要使用的新列名列表 - 我将此表称为NewColumnNames:
然后,在Table1中工作,我可以双击第一列标题并将其重命名为任何内容 - 我将输入Test:
然后,在公式栏中,替换这个突出显示的部分,这是一个列名称I' m替换(" Column1")和名称I' m替换它("试验&#34)...
...与List.Zip({Table.ColumnNames(Source),NewColumnNames[NewColumnNames]})
。此更改将使用NewColumnNames表中NewColumnNames列表(列)中的列名替换所有原始列名。
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;
}
}