我试图在我的自定义函数中使用以下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