Holger Stehle

Softwareentwicklung und -architektur

« CSV- zu XML-Dateien konvertieren

Ein bestehendes Projekt von mir beinhaltet eine erweiterbare Dateiverwaltung. Die Anforderung war es nun, CSV-Dateien zu XML-Dateien zu konvertieren. Die Ausgangsdateien haben folgenden einheitlichen Aufbau:

spalte1,spalte2,spalte3
inhaltA,inhaltB,inhaltC
inhaltD,inhaltE,inhaltF

Zwar ist dieser konkrete Kontext sicherlich etwas speziell, jedoch möchte ich die allgemein verwendbare Kernfunktionalität kurz vorstellen. Ihr könnt euch im Folgenden also auf die Methode ConvertFiles konzentrieren:

public static class CsvToXml {
    public static void ConvertDirectory(string path, SearchOption searchOption) {
        CsvToXml.ConvertFiles(Directory.EnumerateFiles(path, "*.csv", searchOption));
    }

    public static void ConvertFiles(params string[] pathList) {
        foreach(string path in pathList) {
            using(StreamReader fileStream = File.OpenText(path)) {
                string currentLine = fileStream.ReadLine();
                string[] fieldList = currentLine.Split(',');

                XElement root = new XElement("entries");
                XDocument document = new XDocument(root);

                while((currentLine = fileStream.ReadLine()) != null) {
                    string[] dataList = currentLine.Split(',');

                    XElement entry = new XElement("entry");
                    root.Add(entry);

                    for(int i = 0; i < dataList.Length; i++) {
                        entry.Add(new XElement(fieldList[i], dataList[i]));
                    }
                }

                document.Save(Path.Combine(
                    Path.GetDirectoryName(path),
                    String.Concat(Path.GetFileNameWithoutExtension(path), ".xml")
                ));
            }
        }
    }
}

Ich habe die beispielhafte Implementierung bereits etwas vereinfacht und wie üblich um Fehlerbehandlungen etc. reduziert, um den Fokus auf die eigentliche Funktionalität zu legen. Die Verwendung gestaltet sich nun sehr einfach:

CsvToXml.ConvertDirectory(@"X:\data", SearchOption.TopDirectoryOnly);

Die zu Beginn beschriebene Beispiel-Datei würde nun zu folgender Datei konvertiert:

<?xml version="1.0" encoding="utf-8"?>
<entries>
  <entry>
    <spalte1>inhaltA</spalte1>
    <spalte2>inhaltB</spalte2>
    <spalte3>inhaltC</spalte3>
  </entry>
  <entry>
    <spalte1>inhaltD</spalte1>
    <spalte2>inhaltE</spalte2>
    <spalte3>inhaltF</spalte3>
  </entry>
</entries>

Natürlich kann diese grundlegende Funktionalität beliebig erweitert werden, beispielsweise für weitere Dateiendungen oder um die Bezeichner der äußeren Elemente (entries und entry) individuell angeben zu können. Je nach gewünschtem Einsatzzweck kann insbesondere auch die SearchOption-Aufzählung interessant sein.