CSV2CSV

Im Bereich DirSync habe ich verschiedene Script, die letztlich fast alle irgendwie mit CSV-Dateien arbeiten. Die einen exportieren Kontakte aus Notes-Adressbüchern, aus Exchange Kontakten aus Datenbanken und natürlich dem Active Directory. Andere nutzen diese CSV-Dateien, um damit Kontakte in einem Ziel-Active-Directory, in Outlook oder wo auch immer anzulegen. Allen gemeinsam ist, dass sie korrekte Daten in den CSV-Dateien erwarten. Oft sind aber die Daten einer Quelle nicht für den Import im Ziel geeignet, sondern müssen umformatiert werden. Anstatt nun in den verschiedenen Import und Export-Scripten aufwändige "Konverter" einzubauen, habe ich mich dem Skript CSV2CSV eine Lösung geschaffen um flexibel die Daten einer CSV-Datei in eine andere CSV-Datei zu überführen. Dabei werden nicht Delimiter und Encoding umgesetzt, sondern durch die Möglichkeit eigenen Code einzubauen können auch Feldinhalte umgebaut werden.

Konfiguration

CSV2CSV ist eine PowerShell-Script, welches eine gegebene CSV-Datei einliest und anhand von Übersetzungsregeln in eine neue CSV-Datei exportiert. Es kann daher dazu genutzt, werden, um CSV-Dateien, die aus einer Quelle bereit gestellt werden, automatisiert zu verarbeiten und für Programme wie CSV2EX als Eingabe genutzt werden können. Das Prinzip der CSV-Dateien habe ich auch auf CSVSync schon beschrieben, auch wenn dieses VBScript-Paket noch nicht fertig geworden ist.

Einziger Parameter ist der Pfad zu einer XML-Datei, in der die eigentliche Konfiguration liegt:

Das Skript braucht für die Funktion eine ganze Menge von Parametern. Neben der Eingabedatei, die eventuell noch von Angaben zu Trennzeichen, Zeichensatz und Header-Feldern begleitet wird und der Pfad zu r Ausgabedatei ist vor allem die Umsetzung der Feldinhalte aus der Quelle in das Ziel dynamisch gestaltet. Speziell wenn Sie mehrere CSV-Dateien haben, wollte ich nicht jedes mal die PS1-Datei selbst verändern. Daher wurden all diese Einstellungen in einer XML-Datei ausgelagert. Hier ein Beispiel:

 

Sie sehen den Bereich "<import>", mit dem die Eingabedatei spezifiziert wird und unten den Bereich "<export>" für die Ausgabe. In der Mitte als "<translate>" können Sie dann angeben, welche Felder (Hier dn, mail, test) mit welchen Daten der Quelle "$source.feldname" gefüllt werden. Das CSV2CSV.PS1 interpretiert den Wert des XML-Knotens als Code. So ist eine fast unbeschränkte Flexibilität gegeben. Sollten Sie im Code aber Zeichen wie "<" verwenden, dann sollten Sie den Code wie im Beispiel auch gezeigt mit einem CDATA-Block einschließen.

Aufruf

Entsprechend einfach gestaltet sich der Aufruf, wenn Sie die XML-Datei mit den Konfigurationen einmal angelegt haben

.\csv2csv.ps1 -configxml <pfad zur XML-Datei>

Das Skript selbst ist sehr übersichtlich aber enthält noch Codeteile, die aktuell nicht angesprochen werden.

csv2csv.1.0.ps1
Nach dem Download bitte die Erweiterung "TXT" entfernen.

Weiterentwicklung

Das Skript ist eine Version 1.0 und es gibt sicher noch Platz für weitere Entwicklungen, z.B.:

  • Fehlerbehandlung
    Aktuell ist die Fehlerbehandlung natürlich nur rudimentär. Ich kann also nicht sicher sein, dass das Skript fehlerfrei gelaufen ist. Bei CSV2EX habe ich schon gezeigt, dass ich zur Sicherung der Vollständigkeit eine besondere "Ende-Zeile" nutzen. So kann ein nachfolgendes Programm indirekt erkennen, ob das Skript bis zu Ende gelaufen ist.
  • Eventlog
    Im Code hinterlegt finden Sie schon die Teile um Bei Fehlern und Warnungen entsprechende Eventlogeinträge zu generieren. Sie sind aber noch nicht eingebunden.

Weitere Links