3

PowerQuery では、固定幅の txt ファイルをインポートする必要があります (各行は多数のフィールドの連結であり、各フィールドは特定の長さに固定されています)。インポートすると、たとえば次の形式で、txt 行を含む 1 つの列を持つテーブルが取得されます。

AAAABBCCCCCDDD

この方法でさらに列を追加したい:

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

つまり、ソース列を構成するフィールドの長さはわかっていますが、この長さはすべてのフィールドで同じではありません (上記の例では、長さは 4、2、5、3 です)。

「Split Column」>「By number of character」ユーティリティを使用したいのですが、一度に 1 つの長さしか挿入できません。目的の出力を得るには、プロセスを 3 回繰り返して 1 つ追加する必要があります。毎回列を分割し、「列を分割」>「文字数ごと」ユーティリティの「できるだけ左に 1 回」オプションを使用します。

私の実際のケースでは、インポートして変換するさまざまな行の種類 (ファイル) があり、それぞれに 20 を超えるフィールドがあるため、手動のアプローチは少なくて済みます。どういうわけかレコード構造(各フィールドの長さ)を指定し、行を自動的に分割したいと思います:)

おそらく、私が何も知らないMコードが必要になるでしょう.誰かが私を正しい方向に向けることができますか?

ありがとう!

4

1 に答える 1

2

以下の式でクエリを作成します。このクエリを SplitText と呼びましょう:

させて
    SplitText = (テキスト、長さ) =>
    させて
        LengthsCount = List.Count(長さ),
        // lengths リストのインデックスと、次の文字を取得するテキスト内の位置を追跡します。この情報を使用して次のセグメントを取得し、リストに入れます。
        Split = List.Generate(() => {0, 0}、各 _{0} < 長さ数、各 {_{0} + 1、_{1} + 長さ{_{0}}}、各テキスト。範囲(テキスト, _{1}, 長さ{_{0}}))
    の
        スプリット、
    // リストをレコードに変換して
    ListToRecord = (テキスト、長さ) =>
    させて
        List = SplitText(テキスト、長さ)、
        Record = Record.FromList(List, List.Transform({1 .. List.Count(List)}, each Number.ToText(_)))
    の
        記録
の
    ListToRecord

次に、表に、次の式を使用するカスタム列を追加します。

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

最初の引数は分割するテキストで、2 番目の引数は分割する長さのリストです。

最後に、列を展開して、分割されたテキスト値をテーブルに取得します。1、2 などの名前が付けられるため、列の名前を変更することをお勧めします。

于 2015-08-27T18:51:58.177 に答える