PowerQuery:按可变字段长度拆分列

3
在PowerQuery中,我需要导入一个固定宽度的文本文件(每行是多个字段的连接,每个字段具有固定的特定长度)。 当我导入它时,我会得到一个只包含文本行的单列表格,例如以下格式:
AAAABBCCCCCDDD

我想这样添加更多的列:
Column1: AAAA
Column2: BB
Column3: CCCCC
Column4: DDD

换言之,源列组成的字段长度已知,但这些长度并非所有字段都相同(例如,在上面的示例中,长度为4、2、5、3)。
我想使用“拆分列”>“按字符数”工具,但我只能一次插入一个单一长度,并且要获得所需的输出结果,我必须重复三次此过程,每次添加一列,并对“拆分列”>“按字符数”实用程序的“尽可能靠左”选项进行使用。
我的真实案例有许多不同的行类型(文件)需要导入和转换,每个文件都有超过20个字段,因此需要一个更少的手动方法;我希望以某种方式指定记录结构(每个字段的长度),并自动拆分行。
这可能需要一些M代码,而我对此一无所知:有谁能指点我正确的方向?
谢谢!
1个回答

2
使用以下公式创建一个查询。我们将其称为SplitText:
let
    SplitText = (text, lengths) => 
    let
        LengthsCount = List.Count(lengths),
        // 跟踪长度列表和从中获取下一个字符的文本位置的索引。 使用此信息获取下一个片段并将其放入列表中。
        Split = List.Generate(() => {0, 0}, each _{0} < LengthsCount, each {_{0} + 1, _{1} + lengths{_{0}}}, each Text.Range(text, _{1}, lengths{_{0}}))
    in
        Split,
    // 将列表转换为记录以...
    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
然后,在您的表中,添加一个使用此公式的自定义列:

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

第一个参数是要拆分的文本,而第二个参数是要按长度拆分的列表。
最后,展开该列以将拆分文本值放入表中。 您可能需要重命名这些列,因为它们将被命名为1、2等等。

当遇到空值时,它不会获取该行中该值或其右侧的任何值。如何修改以考虑空值? - curtisp

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接