import Script from "../Script" import { readFileSync, writeFileSync } from "fs" import { OsmId } from "../../src/Models/OsmFeature" import { Utils } from "../../src/Utils" interface DiffItem { /** * Velopark-id */ ref: string osmid: OsmId distance: number diffs: { key: string /** * The value in OpenStreetMap * Might be undefined if OSM doesn't have an appropriate value */ osm?: string velopark: string | number }[] } export class DiffToCsv extends Script { constructor() { super( "Converts a 'report.diff' to a CSV file for people who prefer LibreOffice Calc (or other Spreadsheet Software)" ) } async main(args: string[]): Promise { const file = args[0] ?? "report_diff.json" const json = <{ diffs: DiffItem[]; distanceBinds: number[] }>( JSON.parse(readFileSync(file, "utf8")) ) const diffs = json.diffs const allKeys = Utils.Dedup(diffs.flatMap((item) => item.diffs.map((d) => d.key))) allKeys.sort() const header = [ "osm_id", "velopark_id", "distance", ...allKeys.flatMap((k) => ["osm:" + k, "velopark:" + k]), ] const lines = [header] for (const diffItem of diffs) { const line = [] lines.push(line) line.push(diffItem.osmid) line.push(diffItem.ref) line.push(diffItem.distance) const d = diffItem.diffs for (const k of allKeys) { const found = d.find((i) => i.key === k) if (!found) { line.push("", "") continue } line.push(found.osm, found.velopark) } } const path = "report_diff.csv" writeFileSync(path, lines.map((l) => l.join(",")).join("\n"), "utf8") console.log("Written", path) } } new DiffToCsv().run()