有如下表格1,第二列到第十一列的名称为MB1,MB2,……,M10。现在需要在每一行中寻找出第一次出现负数的列并在计算列1stMB中显示出该列的名称,最终效果如表格2所示。
因为最终目的为添加计算列显示每一行中第一次出现负数的列名称,需要使用如下以Table.AddColumn()为主体的函数组合(以下Power Query对象Data对应表格1):
let Add_Col = Table.AddColumn( Data, "1stMB", (x)=˃ Table.FirstValue( Table.RemoveFirstN( Record.ToTable( x ), (y)=˃ y[Value] ˃= 0 ) ), type text ) in Add_Col
Table.AddColumn()会把表格1的每一行以记录(Record)为单位传入Record.ToTable(),被传入的记录在Record.ToTable()的作用下会转化为如下图所示的内嵌表格(下图对应表格1中的第7行):
之后,Table.RemoveFirstN()会把上图红色方框圈中的行移除,结果如下所示:
从上图中,不难发现以上表格左上角的值就是计算列在当前行所需要显示的值,所以最后一步需要使用Table.FirstValue()取出该值。如果使用List.Generate()进行求解,所需的运行时间较少但是代码会显得稍微复杂,有兴趣的读者可以查阅附件中的Final Solution2.xlsm附件。
Table.AddColumn(Source,"1stMB",each Table.ColumnNames(Source){List.Count(List.FirstN(Record.ToList(_),each _>=0))})
Table.ColumnNames(Source) & {null}才可以避免全是正数产生错误
不用Table.FirstValue也可以,在后面直接加{0}[Name]
= Table.AddColumn(源, "1stMB",(x)=> try Table.Skip(Record.ToTable(x),(y)=>y[Value]>=0)[Name]{0} otherwise null)
= Table.AddColumn(a,"name",(x)=>Table.ColumnNames(a){List.PositionOf(List.Transform(List.Skip(Record.ToList(x)),(y)=>Number.Sign(Number.From(y))),-1)+1})
Table.add column (表,”列名”, each list.transform({[mb1],[mb2],[mb3],[mb4], ..[mb10],(m)=> if m<=0 then table.columnnames(表[_]) else null)))
已添加自定义 = Table.AddColumn(更改的类型, "自定义", each List.PositionOfAny(List.Transform({[MB1],[MB2],[MB3],[MB4],[MB5],[MB6],[MB7],[MB8],[MB9],[MB10]},(m)=>if m<=0 then 1 else null),{1})),
已添加自定义1 = Table.AddColumn(已添加自定义, "自定义.1", each List.Skip(Table.ColumnNames(已添加自定义))),
已添加自定义2 = Table.AddColumn(已添加自定义1, "自定义.2", each [自定义.1]{[自定义]})
利用有限的知识做出来的,楼上好多用法还不会,(⊙o⊙)…,继续学习
= Table.AddColumn(Source, "1stMB", each try Table.ColumnNames(Source){List.PositionOf(List.Transform(Record.ToList(_), each if _ 0" )
let
源 = Csv.Document(File.Contents("D:\015 提取第一次出现负数\Data3.csv"),[Delimiter=",", Columns=11, Encoding=936, QuoteStyle=QuoteStyle.None]),
提 = Table.PromoteHeaders(源, [PromoteAllScalars=true]),
b = Table.AddColumn(提, "b", each (Table.ColumnNames(提){List.PositionOf(Record.ToList(_), List.Select(Record.ToList(_),(x)=>Number.FromText(x)<0){0})}))
in
b
= Table.AddColumn(源, "自定义", each [a=Record.ToTable(_),b=List.First(Table.Skip(a,(x)=>x[Value]>=0)[Name])][b])
这个可以避免全部正数错误
= Table.AddColumn(源, "自定义", each [a=Record.ToTable(_),b=List.First(Table.Skip(a,(x)=>x[Value]>=0)[Name]) ?? null][b])