对于 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)
你们能告诉我如何修改代码吗?
您可以按如下方式读取 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 的博客上阅读更多内容。