具有超过 100 万条记录的文件中具有强大查询结果的 Unpivot 文件
Unpivot file with power query results in file with more than 1 million records
在逆透视过程完成之前是否有机会拆分文件?我曾尝试做相反的事情,即拆分文件然后取消透视它,但由于我必须处理 20 多个文件并且我无法编写功能宏,因此需要太多时间做这项工作。
我必须实现它,因为我必须将文件加载到另一个没有反旋转功能的软件中,而且我无法直接访问他们的数据库以进行 运行 任何查询。
使用 VBA 有一个可能的解决方案。在这种方法中,您需要:
- 将 Power Query table 加载到 Power Pivot 工作簿数据模型中
- 使用 VBA
从工作簿数据模型中获取数据
- 将记录写入 CSV 文件
下面是一步一步的操作方法。
为了校对,我使用以下代码在 Power Query 中创建了一个包含 300 万行的虚拟 table,并将其命名为 "MyData"。
// MyData: A table of 3 million rows
let RowCount = 3000000
in Table.FirstN(
Table.FromColumns({
List.Generate(() => 1, each true, each _ + 1),
List.Generate(() => Number.Random() * 1000, each true, each Number.Random() * 1000)
}, type table [ID = Int64.Type, RandomNumber = number]),
RowCount
)
我通过选择关闭并加载到,然后选择仅创建连接,将此table加载到工作簿数据模型中并检查将此数据添加到数据模型。
然后,使用下面的 VBA 代码,我能够连接到数据模型,获取记录,并将其转储到 CSV 文件中。
Const OutFile As String = "C:/path/to/MyData.csv"
Dim Wb As Workbook
Set Wb = Application.ActiveWorkbook
Wb.Model.Initialize
'Connection to the Data Model
Dim Conn As Object 'ADODB.Connection
Set Conn = Wb.Model.DataModelConnection.ModelConnection.ADOConnection
Dim Recordset As Object 'ADODB.Recordset
Set Recordset = CreateObject("ADODB.Recordset")
Dim Query As String
Query = "EVALUATE MyData" 'DAX query to return the entire table
Recordset.Open Query, Conn
Dim FileNum: FileNum = FreeFile()
Open OutFile For Output As #FileNum
Do While Not Recordset.EOF
Write #FileNum, Recordset("MyData[ID]"), Recordset("MyData[RandomNumber]")
Recordset.MoveNext
Loop
Close #FileNum
在逆透视过程完成之前是否有机会拆分文件?我曾尝试做相反的事情,即拆分文件然后取消透视它,但由于我必须处理 20 多个文件并且我无法编写功能宏,因此需要太多时间做这项工作。 我必须实现它,因为我必须将文件加载到另一个没有反旋转功能的软件中,而且我无法直接访问他们的数据库以进行 运行 任何查询。
使用 VBA 有一个可能的解决方案。在这种方法中,您需要:
- 将 Power Query table 加载到 Power Pivot 工作簿数据模型中
- 使用 VBA 从工作簿数据模型中获取数据
- 将记录写入 CSV 文件
下面是一步一步的操作方法。
为了校对,我使用以下代码在 Power Query 中创建了一个包含 300 万行的虚拟 table,并将其命名为 "MyData"。
// MyData: A table of 3 million rows
let RowCount = 3000000
in Table.FirstN(
Table.FromColumns({
List.Generate(() => 1, each true, each _ + 1),
List.Generate(() => Number.Random() * 1000, each true, each Number.Random() * 1000)
}, type table [ID = Int64.Type, RandomNumber = number]),
RowCount
)
我通过选择关闭并加载到,然后选择仅创建连接,将此table加载到工作簿数据模型中并检查将此数据添加到数据模型。
然后,使用下面的 VBA 代码,我能够连接到数据模型,获取记录,并将其转储到 CSV 文件中。
Const OutFile As String = "C:/path/to/MyData.csv"
Dim Wb As Workbook
Set Wb = Application.ActiveWorkbook
Wb.Model.Initialize
'Connection to the Data Model
Dim Conn As Object 'ADODB.Connection
Set Conn = Wb.Model.DataModelConnection.ModelConnection.ADOConnection
Dim Recordset As Object 'ADODB.Recordset
Set Recordset = CreateObject("ADODB.Recordset")
Dim Query As String
Query = "EVALUATE MyData" 'DAX query to return the entire table
Recordset.Open Query, Conn
Dim FileNum: FileNum = FreeFile()
Open OutFile For Output As #FileNum
Do While Not Recordset.EOF
Write #FileNum, Recordset("MyData[ID]"), Recordset("MyData[RandomNumber]")
Recordset.MoveNext
Loop
Close #FileNum