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:
CSV-Dateiformat (→ test.csv)
010203
spalte1,spalte2,spalte3inhaltA,inhaltB,inhaltCinhaltD,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:
Konvertierung implementieren
010203040506070809101112131415161718192021222324252627282930313233
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:
Konvertierung anwenden
01
CsvToXml.ConvertDirectory(@"X:\data", SearchOption.TopDirectoryOnly);
Die zu Beginn beschriebene Beispiel-Datei würde nun zu folgender Datei konvertiert:
XML-Dateiformat (→ test.xml)
01020304050607080910111213
<?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.


Projektverweise

Kategorien / Archiv  |  Übersicht RSS-Feed

Schlagworte

Suche