Power Query中的列表切片代码运行到运行时错误,函数被分配给列表?



我试图在我的自定义函数中使用以下M代码,通过拆分偏移量列表对列表进行切片。

我不确定为什么这一行会出现错误。我已经使用查询设计器将其本地化到。">

中"之前的最后一个表达式
let
BodyText = Table1_2,
splitfunc = SMTSplit,
SplitLines = Text.Split(BodyText, "#(lf)"),
CleanedLines = List.Transform(SplitLines, each Text.Remove(_, {":",";"," "})),

SplitCriteria = List.Transform(CleanedLines, each splitfunc(_)),

CriteriaIndexes = List.PositionOf(SplitCriteria, true,Occurrence.All),
Rejoin = (LineList as list) as text => List.Combine(List.Transform(LineList, each _ + "#(lf)")),

IndexIndex = List.Positions(CriteriaIndexes),

MaxIndexIndex = List.Max(IndexIndex),
MaxLineIndex = List.Max(List.Positions(SplitLines)),
BodySplits = List.Transform( IndexIndex, each if _ < MaxIndexIndex
then List.Range(CriteriaIndexes(_), CriteriaIndexes(_)- CriteriaIndexes(_))
else List.Range(CriteriaIndexes(_), MaxLineIndex - CriteriaIndexes(_))
)
in
BodySplits

这将导致表达式错误,表明我试图将列表转换为函数。

Expression.Error: We cannot convert a value of type List to type Function.
Details:
Value=[List]
Type=[Type]

如果有人知道在Power Query中通过索引切片列表的更好方法,请告诉我!

编辑:表12中的数据是一个带有行返回值的字符串。

SMT6
Sometexthere
TMs
Header1
kkagorqr
an
fgaklgas55SMT3
dall
WorkingonSMT6

另外,自定义函数SMTSplit是:

SMTSplit = (TestText as text) => let
split = Text.Length(TestText) < 6 and Text.Contains(TestText, "SMT")
in
split
enter code here

我使用了()函数语法,而我应该使用{}语法通过索引访问列表元素。

它现在工作了!

= (BodyText as text, splitfunc as function) => let
SplitLines = Text.Split(BodyText, "#(lf)"),
CleanedLines = List.Transform(SplitLines, each Text.Remove(_, {":",";"," "})),

SplitCriteria = List.Transform(CleanedLines, each splitfunc(_)),

CriteriaIndexes = List.PositionOf(SplitCriteria, true,Occurrence.All),
Rejoin = (LineList as list) as text => Text.Combine(List.Transform(LineList, each Text.Combine({_, "#(lf)"}))),

IndexIndex = List.Positions(CriteriaIndexes),

MaxLineIndex = List.Max(List.Positions(SplitLines)),
BodySplits = List.Transform(IndexIndex, each if _ < List.Max(IndexIndex) and List.Max(IndexIndex) >0
then Rejoin(List.Range(SplitLines,CriteriaIndexes{_}, CriteriaIndexes{_+1} - CriteriaIndexes{_}))
else Rejoin(List.Range(SplitLines, CriteriaIndexes{_}, List.Max(List.Positions(SplitLines))))
),
LineList = List.Transform(IndexIndex, each CleanedLines{CriteriaIndexes{_}}),
ResultTable = Table.FromColumns({LineList, BodySplits}, {"Line","SplitBody"})
in ResultTable

最新更新