Falaaa, pessoal!

Só alegria? 

Blog de cara nova e informação quentinha na área!!!! Nóisss é chique!!

Já quer o Power BI é tão Power, consigo importar arquivo ZIP? 

Mas tire o cavalinho da chuva, é ZIP ein, nada de .Rar, 7z ou algo da família dos compactados! 

Vamos pensar…

Seu cliente, tem vários arquivos XML, ou Excel, já zipados, e você precisa fazer uma carga histórica e não quer descompactar!

Ou melhor, você quer ganhar espaço para importar os dados. Não quer ter uma pasta com 50 gb de arquivos Excel. 

Como também, tem muitos sites que exportam seus dados já zipados. 

Então vamos colocar a mão na massa. 

Este é meu diretório inicial de arquivos: 

Perceba que tenho apenas 8.21mb. 

Quando eu abro apenas 1 arquivo, olha o tamanho do cara!

Agora pensa. 

Vamos fazer uma conta rápida. 

7 arquivos x 13mb = 91 mb 

E antes eu tinha 8mb. 

Vamos a mágica: 

Abra o Editor de Consultas 

Crie uma Consulta Nula

 

Você vai criar uma função com este código: 

let
    Source = File.Contents("C:\diretorio\arquivo.zip"),

    DecompressFiles = (ZIPFile, Position, FileToExtract, DataSoFar) => 
    let 
    
    MyBinaryFormat = try BinaryFormat.Record([DataToSkip=BinaryFormat.Binary(Position), 
                      MiscHeader=BinaryFormat.Binary(18), 
                      FileSize=BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32, ByteOrder.LittleEndian),
                      UnCompressedFileSize=BinaryFormat.Binary(4),
                      FileNameLen=BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16, ByteOrder.LittleEndian),
                      ExtrasLen=BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16, ByteOrder.LittleEndian),
                      TheRest=BinaryFormat.Binary()]) otherwise null,

    MyCompressedFileSize = try MyBinaryFormat(ZIPFile)[FileSize]+1 otherwise null,

    MyFileNameLen = try MyBinaryFormat(ZIPFile)[FileNameLen] otherwise null,

    MyExtrasLen = try MyBinaryFormat(ZIPFile)[ExtrasLen] otherwise null,

    MyBinaryFormat2 = try BinaryFormat.Record([DataToSkip=BinaryFormat.Binary(Position), Header=BinaryFormat.Binary(30), Filename=BinaryFormat.Text(MyFileNameLen), Extras=BinaryFormat.Binary(MyExtrasLen), Data=BinaryFormat.Binary(MyCompressedFileSize), TheRest=BinaryFormat.Binary()]) otherwise null,

    MyFileName = try MyBinaryFormat2(ZIPFile)[Filename] otherwise null,

    GetDataToDecompress = try MyBinaryFormat2(ZIPFile)[Data] otherwise null,

    DecompressData = try Binary.Decompress(GetDataToDecompress, Compression.Deflate) otherwise null,

    NewPosition = try Position + 30 + MyFileNameLen + MyExtrasLen + MyCompressedFileSize - 1 otherwise null,

    AsATable = Table.FromRecords({[Filename = MyFileName, Content=DecompressData]}),

    #"Appended Query" = if DecompressData = null then DataSoFar else if (MyFileName = FileToExtract) then AsATable else
            if (FileToExtract = "") and Position <> 0 then Table.Combine({DataSoFar, AsATable})
            else AsATable    

    in

     if  (MyFileName = FileToExtract) or (#"Appended Query" = DataSoFar) then

       #"Appended Query"

     else 

       @DecompressFiles(ZIPFile, NewPosition, FileToExtract, #"Appended Query"),

    MyData = DecompressFiles(Source, 0, "", null)

in
    MyData

Com isto, temos o seguinte. 

Neste caso, como o site exportava mês a mês um arquivo zipado, tive que invocar função para cada arquivo, mas se você tiver apenas um Zip, e todos os arquivos ali dentro, também funciona, fique tranquilo. 

No meu caso resultou nisto aqui. 

Legal, mas porque esta em itálico e desativada a carga? 

É que eu só carreguei uma vez, não queria carregar várias vezes. 

“Ok Igor, e agora?” 

Agora é tranquilo.  

Quer aprender a juntar todas estas tabelas, aguarde o próximo post……

Absss power

Parte 2:
http://www.bidoconceitoapratica.com.br/2018/05/15/agrupando-tabelas-no-powerbi-powerquery/

 

Importando arquivo Zip para o PowerBI
Classificado como:            

9 ideias sobre “Importando arquivo Zip para o PowerBI

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *