Excel Power Query-解析一个非常奇怪的文件
我有一个文件如下所示:Excel Power Query-解析一个非常奇怪的文件,excel,m,Excel,M,我有一个文件如下所示: 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行。 我想
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的新手,我想我开始时遇到了太多太重的问题,无法处理;)如有任何关于我应该如何构建表格和/或列表以帮助我的具体想法,将不胜感激 多谢各位 问候,,
马丁我很肯定你不能在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
Sub-NormalizeData()
将sFile设置为字符串,将lFile设置为长文件
作为变异体的缬氨酸
作为变量的数据
我和我一样长,我和我一样长
Dim dc作为脚本.Dictionary
黯淡的开始和漫长的
'打开文件并读入所有数据
sFile=“K:\testfile.txt”
lFile=FreeFile
打开sFile作为lFile输入
vaLines=Split(输入$(LOF(lFile),lFile),vbNewLine)
封闭式文件
对于i=LBound(缬氨酸)至UBound(缬氨酸)
vaData=拆分(缬氨酸(i),“,”)
如果vaData(0)“ZZ”,则
'输出现有词典(如果存在)
如果不是dc,则Debug.Print连接(dc.Items,“,”)
'创建新词典并从第一列(0)开始
Set dc=New Scripting.Dictionary
lStart=0
其他的
'以ZZ开头,因此跳过第一列
lStart=1
如果结束
'将数据添加到字典中
对于j=L起始至UBound(vaData)
dc.添加dc.计数+1,vaData(j)
下一个j
接下来我
'输出最后一个字典
如果不是dc,则Debug.Print连接(dc.Items,“,”)
端接头
我知道这是一个老问题,我的解决方案可能在当时不起作用。但当我在PowerBI桌面上试用时,这个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
let
RecordKey=(t,n)=>Table.Range(t,n,1){0}[Key],
NeedsMerged=(t,n)=>
尝试
如果记录键(t,n+1)=“ZZ”,则为true,否则为false
否则是错误的,
MergeWithNext=(t,n)=>
如果需要(t,n),则
让
thisRow=表范围(t,n,1),
nextRow=表范围(t,n+1,1)
在里面
{
是的,
表.范围(t,0,n)&
Table.TransformColumns(thisRow,{“Data”,()=>Trow{0}[Data]})&
表.范围(t,n+2)
}
否则{false,t},
DoNeededMerging=(t,n)=>
如果Table.RowCount(t)
我了解您的VBA逻辑,这就是我希望使用Power Query实现的功能。我很肯定这是可以做到的:)我在考虑尝试用一个索引派生一个行号,然后定义另一列,如果第一列是ZZ,则行号与前一列相同。。然后我就可以将记录分组在一起,并使用列表/表格来操纵字符串。。。