如何使用Power Query解压GZ文件?

问题描述 投票:0回答:1

对于 zip 文件,我找到了这个 code 和这个 tutorial 解释了如何使用代码并且效果很好。

问题是我有

gz
文件而不是
zip
文件。
gz
文件包含
csv

所以我尝试更新一些值,例如使用 Compression.GZip 而不是 Compression.Deflate,但这没有帮助。我仍然有一张空桌子。

(GZFile) =>
let
    Header = BinaryFormat.Record([
        MiscHeader = BinaryFormat.Binary(14),
        BinarySize = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32, ByteOrder.LittleEndian),
        FileSize   = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32, ByteOrder.LittleEndian),
        FileNameLen= BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16, ByteOrder.LittleEndian),
        ExtrasLen  = BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger16, ByteOrder.LittleEndian)    
    ]),
 
    HeaderChoice = BinaryFormat.Choice(
        BinaryFormat.ByteOrder(BinaryFormat.UnsignedInteger32, ByteOrder.LittleEndian),
        each if _ <> 67324752             // not the IsValid number? then return a dummy formatter
            then BinaryFormat.Record([IsValid = false, Filename=null, Content=null])
            else BinaryFormat.Choice(
                    BinaryFormat.Binary(26),      // Header payload - 14+4+4+2+2
                    each BinaryFormat.Record([
                        IsValid  = true,
                        Filename = BinaryFormat.Text(Header(_)[FileNameLen]),
                        Extras   = BinaryFormat.Text(Header(_)[ExtrasLen]),
                        Content  = BinaryFormat.Transform(
                            BinaryFormat.Binary(Header(_)[BinarySize]),
                            // (x) => try Binary.Buffer(Binary.Decompress(x, Compression.Deflate)) otherwise null
                            (x) => try Binary.Buffer(Binary.Decompress(x, Compression.GZip)) otherwise null
                        )
                        ]),
                        type binary                   // enable streaming
                )
    ),
 
    ZipFormat = BinaryFormat.List(HeaderChoice, each _[IsValid] = true),
 
    Entries = List.Transform(
        List.RemoveLastN( ZipFormat(GZFile), 1),
        (e) => [FileName = e[Filename], Content = e[Content] ]
    )
in
    Table.FromRecords(Entries)

你们能告诉我如何修改代码吗?

excel gzip powerquery data-analysis m
1个回答
0
投票

您可以按如下方式读取 GZIP 中的 CSV:

let
    Source = Binary.Decompress(File.Contents("C:\Users\Dav\Downloads\test.gz"), Compression.GZip),
    #"Imported CSV" = Csv.Document(Source,[Delimiter=",", Encoding=1252])

in
    #"Imported CSV"

您还可以在 Chris Webb 的博客上阅读更多内容。

© www.soinside.com 2019 - 2024. All rights reserved.