powerquery 按可变字段长度拆分列

powerquery split column by variable field lengths

在PowerQuery中我需要导入一个固定宽度的txt文件(每一行都是一些字段的串联,每个字段都有固定的特定长度)。 当我导入它时,我得到一个 table 和一个包含 txt 行的单列,例如采用以下格式:

AAAABBCCCCCDDD

我想通过这种方式添加更多列:

Column1: AAAA
Column2: BB
Column3: CCCCC
Column4: DDD

换句话说,组成源列的字段的长度是已知的,但所有字段的长度并不相同(在上面的示例中,长度为:4,2,5,3)。

我想使用 "Split Column">"By number of character" 实用程序,但我一次只能插入一个长度,要获得所需的输出,我必须重复该过程3 次,每次添加一列并使用 "Split Column">"By number of character" 实用程序的 "Once, as far left as possible" 选项。

我的真实案例有许多不同的行类型(文件)要导入和转换,每个行类型(文件)都有 20 多个字段,因此需要较少的手动方法;我想以某种方式指定记录结构(每个字段的长度)并自动拆分行:)

可能需要一些 M 代码,我对此一无所知:谁能指出正确的方向?

谢谢!

使用以下公式创建查询。我们将此查询称为 SplitText:

let
    SplitText = (text, lengths) => 
    let
        LengthsCount = List.Count(lengths),
        // Keep track of the index in the lengths list and the position in the text to take the next characters from. Use this information to get the next segment and put it into a list.
        Split = List.Generate(() => {0, 0}, each _{0} < LengthsCount, each {_{0} + 1, _{1} + lengths{_{0}}}, each Text.Range(text, _{1}, lengths{_{0}}))
    in
        Split,
    // Convert the list to a record to 
    ListToRecord = (text, lengths) => 
    let
        List = SplitText(text, lengths),
        Record = Record.FromList(List, List.Transform({1 .. List.Count(List)}, each Number.ToText(_)))
    in
        Record
in
    ListToRecord

然后,在您的 table 中添加一个使用此公式的自定义列:

each SplitText([Column1], {4, 2, 5, 3})

第一个参数是要拆分的文本,第二个参数是要拆分的长度列表。

最后,展开该列以将拆分文本值放入您的 table。您可能想要重命名这些列,因为它们将被命名为 1、2 等。