Skip to content

fix: CSV- und XML-Export als gueltige, Excel-taugliche Dateien#19

Merged
oliverba81 merged 2 commits into
mainfrom
fix/csv-xml-export
Jun 12, 2026
Merged

fix: CSV- und XML-Export als gueltige, Excel-taugliche Dateien#19
oliverba81 merged 2 commits into
mainfrom
fix/csv-xml-export

Conversation

@oliverba81

Copy link
Copy Markdown
Owner

Problem

Eine im CSV-Format erzeugte Datei war in (deutschem) Excel unbrauchbar: alles in Spalte A, der mehrzeilige Markdown-Inhalt zerfiel über viele Zeilen, Umlaute/Emojis als Mojibake (für, â€", ðŸ'¡). Das XML-Format war nicht wohlgeformt, sobald Felder &/</> oder die Sequenz ]]> enthielten.

Ursachen & Fixes

CSV

  • Scraper.run schrieb via write_text (Textmodus) → csv.writer-\r\n wurde zu \r\r\n, Excels Quote-Parsing brach. → Schreiben jetzt mit open(..., encoding="utf-8-sig", newline="") (BOM + keine Newline-Übersetzung).
  • Komma-Trennzeichen → deutsches Excel splittet beim Doppelklick nur auf ;. → Default ;.
  • Formula-Injection (Felder aus fremden Seiten, =/+/-/@ → Excel-Formel; QUOTE_ALL schützt nicht) → führendes '. Plus C0-Steuerzeichen-Filter.

XML

  • _render_xml defensiv: Steuerzeichen filtern (sonst nicht wohlgeformt – escape() entfernt sie nicht), Titel/URL XML-escapen, Content in CDATA per ]]>-Neutralisierung absichern. CDATA-Template bleibt erhalten → robust auch für Custom-Templates, keine Migration nötig. Einmalige re.sub-Ersetzung statt blindem _apply_template (kein Escaping-Bypass/Platzhalter-Injection).

Defaults/Migration

  • _default_formats + Format-Editor-Defaults auf ;.
  • Einmalige, versionsgeflaggte Migration (formats_rev) hebt das alte Komma der Bestandsnutzer auf ; an – ohne eine spätere bewusste Editor-Wahl zu überschreiben (läuft genau einmal, nicht im Hot-Path).

Bewusste Grenzen

Semikolon-Doppelklick hängt vom Windows-Listentrennzeichen ab (dt. Standard ;); content bleibt voller Markdown (eine Zelle; Excel-Zell-Limit 32.767 Zeichen → nur Anzeige gekürzt, Datei vollständig).

Verifikation (per Import-Tests gegen die echten Funktionen)

  • CSV: BOM vorhanden, kein \r\r\n, ;-Spalten (Header+1 Zeile), Formula-Schutz ('=…), NUL entfernt, content = eine mehrzeilige Zelle inkl. ;/".
  • XML: ET.parse wohlgeformt, ]]>-Roundtrip, & escaped, Steuerzeichen gefiltert.
  • Migration: einmalig ,;, Flag gesetzt; zweiter Lauf respektiert spätere ,-Wahl. Echte Nutzer-Settings im Test gemockt (unberührt).
  • py_compile ok.

Geprüft in zwei Runden durch je 10 Fach-Agenten.

🤖 Generated with Claude Code

oliverba81 and others added 2 commits June 12, 2026 13:42
CSV war in (dt.) Excel unbrauchbar (alles in Spalte A, mehrzeiliger Inhalt zerfaellt, Mojibake); XML war nicht wohlgeformt bei &/</> oder ]]> im Inhalt.

CSV:
- Schreibweg utf-8-sig (BOM) + newline="" statt write_text → behebt korrupte \r\r\n-Zeilenenden und Mojibake in dt. Excel
- Trennzeichen Semikolon (dt. Excel splittet beim Doppelklick auf ;)
- Formula-Injection-Schutz (fuehrendes ' bei =,+,-,@) + Steuerzeichen-Filter (Felder stammen aus fremden Seiten)

XML:
- _render_xml defensiv: Steuerzeichen filtern, Titel/URL XML-escapen, Content in CDATA per ]]>-Neutralisierung absichern; CDATA-Template bleibt erhalten (robust auch fuer Custom-Templates)
- einmalige re.sub-Ersetzung statt blindem _apply_template → kein Escaping-Bypass/Platzhalter-Injection

Migration/Defaults:
- _default_formats + Format-Editor-Defaults auf ;
- einmalige, versionsgeflaggte Migration (formats_rev) hebt altes Komma der Bestandsnutzer auf ; an, ohne spaetere bewusste Editor-Wahl zu ueberschreiben

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Bei CSV-/XML-Ausgabe meldete das Protokoll irrefuehrend 'Konvertiere Inhalt zu Markdown'. Die Meldung nennt jetzt das gewaehlte Zielformat. Nebenbei doppelte fmt/fmt_type-Berechnung entfernt.

Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
@oliverba81 oliverba81 merged commit 2d0257f into main Jun 12, 2026
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant