3

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

AAAABBCCCCCDDD

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

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

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

我想使用“拆分列”>“按字符数”实用程序,但我一次只能插入一个长度,并且要获得所需的输出,我必须重复该过程 3 次,添加一个列,并使用“拆分列”>“按字符数”实用程序的“一次,尽可能向左”选项。

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

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

谢谢!

4

1 回答 1

2

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

让
    SplitText =(文本,长度)=>
    让
        LengthsCount = List.Count(lengths),
        // 跟踪长度列表中的索引和文本中的位置以获取下一个字符。使用此信息获取下一个片段并将其放入列表中。
        Split = List.Generate(() => {0, 0},每个 _{0} < LengthsCount,每个 {_{0} + 1,_{1} + lengths{_{0}}},每个 Text。范围(文本,_{1},长度{_{0}}))
    在
        分裂,
    // 将列表转换为记录
    ListToRecord =(文本,长度)=>
    让
        List = SplitText(文本,长度),
        Record = Record.FromList(List, List.Transform({1 .. List.Count(List)}, 每个 Number.ToText(_)))
    在
        记录
在
    列表到记录

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

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

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

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

于 2015-08-27T18:51:58.177 回答