0

次のようなファイルがあります。

AA,DATA,DATA,DATA
BB,DATA,DATA,DATA,DATA
ZZ,DATA,DATA,DATA,DATA,DATA,DATA
ZZ,DATA,DATA,DATA,DATA,DATA
CC,DATA,DATA
ZZ,DATA,DATA,DATA
ZZ,DATA,DATA,DATA
ZZ,DATA,DATA,DATA,DATA

ご覧のとおり、非常に不親切です。ZZ の開始行は、前のレコードに関連していることを意味します。したがって、私の例では、BB は 3 行に分割され、CC は 4 行に分割されています。Power Query (Excel 2013) で達成したいことは、AA、BB、および CC レコードのみを含むテーブルを取得することです。ZZ は、それぞれの BB および CC レコードに連結されます。ZZ レコードの数は異なる場合があります。
私はPower Queryを初めて使用し、対処するにはあまりにも重い問題から始めたと思います;)私を助けるためにテーブルやリストを作成する方法についての具体的なアイデアをいただければ幸いです。

ありがとうございました。

よろしく、マーティン

4

2 に答える 2

0

PowerQuery ではそれができないことは確かです。VBA を使用してデータを正しく取得し、それを PowerQuery に入れることができます。これを行うことができるコードを次に示します。

Sub NormalizeData()

    Dim sFile As String, lFile As Long
    Dim vaLines As Variant
    Dim vaData As Variant
    Dim i As Long, j As Long
    Dim dc As Scripting.Dictionary
    Dim lStart As Long

    'Open file and read in all the data
    sFile = "K:\testfile.txt"
    lFile = FreeFile

    Open sFile For Input As lFile
    vaLines = Split(Input$(LOF(lFile), lFile), vbNewLine)
    Close lFile

    For i = LBound(vaLines) To UBound(vaLines)

        vaData = Split(vaLines(i), ",")

        If vaData(0) <> "ZZ" Then
            'Output existing dictionary if it exists
            If Not dc Is Nothing Then Debug.Print Join(dc.Items, ",")

            'Create a new dictionary and start at the first column (0)
            Set dc = New Scripting.Dictionary
            lStart = 0
        Else
            'starts with ZZ so skip the first column
            lStart = 1
        End If

        'Add the data to the dictionary
        For j = lStart To UBound(vaData)
            dc.Add dc.Count + 1, vaData(j)
        Next j

    Next i

    'Output the last dictionary
    If Not dc Is Nothing Then Debug.Print Join(dc.Items, ",")

End Sub
于 2014-08-29T15:04:14.667 に答える
0

これは古い質問であることは承知しており、私の解決策が当時はうまくいかなかった可能性があります。しかし、PowerBI Desktop で試してみると、この PQFL はうまく機能します。

let
  RecordKey = (t,n) => Table.Range(t,n,1){0}[Key],

  NeedsMerged = (t,n) =>
    try
      if RecordKey(t,n+1) = "ZZ" then true else false
    otherwise false,

  MergeWithNext = (t,n) =>
    if NeedsMerged(t,n) then
      let
        thisRow = Table.Range(t, n, 1),
        nextRow = Table.Range(t, n+1, 1)
      in  
        {
        true,  
        Table.Range(t, 0, n) &
        Table.TransformColumns( thisRow, {"Data", (_) => _ & nextRow{0}[Data] } ) &
        Table.Range(t, n + 2)
        }
    else {false,t},

  DoNeededMerging = (t,n) =>
    if Table.RowCount(t) < n then t
    else
      let 
        res = MergeWithNext(t,n),
        resp = res{0},
        tbl = res{1}
      in
        if resp then
          @DoNeededMerging(tbl,n)
        else
          @DoNeededMerging(tbl,n+1),

  Filename = "C:\the_data_file.csv",
  DataTable = Table.FromList(Lines.FromText(Text.FromBinary(File.Contents(Filename))), Splitter.SplitTextByDelimiter(","), {"Key","Data"}, null, ExtraValues.List),
  DataTable2 = DoNeededMerging( DataTable , 0)

in
  DataTable2
于 2016-06-11T22:58:19.087 に答える