Wednesday, December 12, 2007

XML vs CSV

Jeg undres altid når folk med længsel taler om "de gode gamle dage" hvor dataudveksling skete med kommaseparerede (CSV) filer.

Ja - jeg vil godt medgive, at CSV-filer fylder mindre, og at der kan være situationer, hvor de kan være at foretrække, hvis der er tale om tabulære datastrukturer med store mængder data. Men er der tale om mere end en enkeltstående udveksling, med lidt mere komplekse data, så er CSV-filer besværligere at manipulere og besværligere at validere.

Jeg gør mig derfor følgende antagelser i nedenstående argumentation:
  • Der er tale om jævnlige udvekslinger af de samme data
  • Udvekslingen skal i størst muligt omfang automatiseres
Hvis man udnytter fordelene med XML og XML Schema har man efter min opfattelse følgende fordele med XML-filer sammenlignet med CSV-filer.
  • XML-filer med et tilknyttet XML Schema med stærke datatyper giver automatisk validering.
  • Med Schematron er det muligt at opsætte endda meget komplekse validering på tværs af data (integritetsregler som vi kender dem fra relationelle databaser).
  • Med XSLT er det en leg at manipulere og præsentere data. En XML-fil kan omdannes til en CSV-fil med et meget simpelt XSLT stylesheet.
  • Versionsinformation er tydelig via namespaces. Sker der en ændring i data, så fremgår det eksplicit af importfilen fordi namespace har ændret sig. Vi får mao. ikke importeret de forkerte data i de forkerte felter. Med en intelligent versioneringsstrategi er det endda muligt importere nye versioner af XML-filer såfremt ændringen er bagudkompatibel med tidligere XML-schemaer (lidt komplekst - men muligt fx i OIOUBL - og jeg forklarer gerne teknikken offline).
Skulle jeg gøre det samme med en CSV-fil, skal jeg skrive min egen parser og manipulator i Perl, Python eller lign. Alternativt kan jeg oprette nogle tabeller i en database, som matcher data i CSV-filen og så skrive et lille script, som manipulerer data til det tabellayout jeg selv har defineret. Med denne arkitektur er jeg stærk afhængig af at de data jeg får leveret i CSV-filen ikke ændrer sig. Får jeg ekstra felter skal jeg til at debugge noget Perl / Python-kode (og det er ikke nogen let sag en time efter det er skrevet) eller også skal jeg til at tilføje felter til min database.

Jeg forstår ikke, at man vil give afkald på alle de fordele som man får foræret med XML-værktøjerne, blot for at spare lidt plads. Jeg er ikke i tvivl om at der findes domæner, hvor plads virkeligt er afgørende, og hvor antallet af transaktioner gør det nødvendigt at se kritisk på hvor meget ens XML fylder. Til militære formål og i kommunikationen med mobile enheder med små båndbredder er det helt sikkert tilfældet. I de fleste andre tilfælde er det min påstand, at den fleksibilitet man taber og den ekstra omkostning man påfører sig (ekstra kode) ikke kan opvejes af tilsvarende fordele når man vælge CSV-formatet.