« 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("entries");
XDocument document = new(root);
while((currentLine = fileStream.ReadLine()) != null) {
string[] dataList = currentLine.Split(',');
XElement entry = new("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.