Hallo Yal,
danke für den Hinweis.
Gut zugegebenermaßen, ich habe ChatGPT zur Hilfe gezogen und damit folgendes gemacht:
die Funktion DecompressZip erstellt:
(ZIPFile) =>
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
then BinaryFormat.Record([IsValid = false, Filename=null, Content=null])
else BinaryFormat.Choice(
BinaryFormat.Binary(26),
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
)
]),
type binary
)
),
ZipFormat = BinaryFormat.List(HeaderChoice, each _[IsValid] = true),
Entries = List.Transform(
List.RemoveLastN( ZipFormat(ZIPFile), 1),
(e) => [FileName = e[Filename], Content = e[Content] ]
)
in
Table.FromRecords(Entries)
und meine Abfrage entsprechend angepasst:
let
// aktuelles Datum für Dateinamen
A = Date.ToText(Date.From(DateTime.LocalNow()), "yyyy-MM-dd"),
// ZIP-Datei-Pfad
PfadZip = "C:\Users\chris\Downloads\zHV_aktuell_csv." & A & ".zip",
// ZIP-Datei einlesen und entpacken
Quelle = File.Contents(PfadZip),
Entpackt = DecompressZip(Quelle),
// passende CSV aus dem ZIP auswählen
CSVFile = Table.SelectRows(Entpackt, each [FileName] = "zHV_aktuell_csv." & A & ".csv"),
Inhalt = CSVFile{0}[Content],
// CSV in Tabelle einlesen
QuelleCSV = Csv.Document(
Inhalt,
[Delimiter=";", Columns=17, Encoding=65001, QuoteStyle=QuoteStyle.None]
),
#"Header gesetzt" = Table.PromoteHeaders(QuelleCSV, [PromoteAllScalars=true]),
// unnötige Spalten entfernen
#"Spalten reduziert" = Table.RemoveColumns(#"Header gesetzt", {
"Type", "DHID", "Parent", "MunicipalityCode", "DistrictCode", "District",
"Description", "Authority", "DelfiName", "THID", "TariffProvider"
}),
// nur gültige Zeilen mit Municipality
#"Nur gültige Zeilen" = Table.SelectRows(#"Spalten reduziert", each [Municipality] <> "-"),
// Spaltentypen konvertieren
#"Typen konvertiert" = Table.TransformColumnTypes(#"Nur gültige Zeilen", {
{"SeqNo", Int64.Type}, {"Name", type text}, {"Latitude", type number},
{"Longitude", type number}, {"Municipality", type text},
{"LastOperationDate", type datetime}
}),
// LastOperationDate als Datum
#"LastOperationDate als Datum" = Table.TransformColumnTypes(#"Typen konvertiert", {
{"LastOperationDate", type date}
}),
// Referenzkoordinaten
latRef = 50.7624067,
lonRef = 6.9998638,
// Entfernung berechnen (Haversine)
MitEntfernung = Table.AddColumn(#"LastOperationDate als Datum", "Entfernung_km", each let
lat1 = latRef * Number.PI / 180,
lon1 = lonRef * Number.PI / 180,
lat2 = [Latitude] * Number.PI / 180,
lon2 = [Longitude] * Number.PI / 180,
dLat = lat2 - lat1,
dLon = lon2 - lon1,
a = Number.Power(Number.Sin(dLat / 2), 2) +
Number.Cos(lat1) * Number.Cos(lat2) * Number.Power(Number.Sin(dLon / 2), 2),
c = 2 * Number.Atan2(Number.Sqrt(a), Number.Sqrt(1 - a)),
r = 6371.0088,
dist = r * c
in
Number.Round(dist, 7)),
// Filter auf 80 km Umkreis
#"Gefiltert auf Umkreis" = Table.SelectRows(MitEntfernung, each [Entfernung_km] <= 80),
// Koordinaten-Spalte ergänzen
MitKoordinaten = Table.AddColumn(#"Gefiltert auf Umkreis", "Koordinaten", each
Number.ToText([Latitude], "0.000000", "en-US") & " " & Number.ToText([Longitude], "0.000000", "en-US"),
type text
),
// Endgültige Spaltenreihenfolge
Ergebnis = Table.ReorderColumns(MitKoordinaten, {
"SeqNo", "Name", "Latitude", "Longitude", "Koordinaten", "Municipality", "LastOperationDate", "Entfernung_km"
}),
// Sortierung nach Entfernung
Sortiert = Table.Sort(Ergebnis, {{"Entfernung_km", Order.Ascending}})
in
Sortiert
funktioniert einwandfrei. Vielen Dank
Christian