Vergleichsformate ======================================================================================================================== Das generische Konzept des „Readers“, innerhalb von NCDiff, sieht vor Daten aus einer Datenquelle zu lesen und diese Daten in einer sortierten tabellarischen Form in einer CSV Datei abzulegen. Diese Datei(en) kann dann wiederum sehr einfach vom nachgelagerten Prozessen verglichen werden. Dieser Mechanismus wird auch bei CSV, XLS und FixedWith Dateien selbst angewendet, obwohl diese Daten selbst schon in tabellarischer Form vorliegen. Grundsätzlich kann dieser Prozess aber natürlich auch auf jegliche andere Datenquelle angewendet werden. FixedWidth ------------------------------------------------------------------------------------------------------------------------ Textformate die fixe Feldlängen für eine tabellarische Auflistung von Werten verwenden können von NCDiff verarbeitet werden. Dazu muss in der Konfiguration die Längen der einzelnen Felder konfiguriert werden. CSV / CSVVAR ------------------------------------------------------------------------------------------------------------------------ Für das lesen des CSV Dateiformat wird die ausgefeilte ``csv`` Bibliothek von Python verwendet. Diese bietet umfangreiche Konfigurationsmöglichkeiten (Trennzeichen, Escape-Zeichen,...) die auch von NCDiff als Konfigurationsparameter zur Verfügung gestellt werden. Der reader für CVS unterstützt nur Dateien mit einem einheitlichen Tabellenformat. Also jede Zeile hat die gleiche Spaltenanzahl. Die sind die überwiegende Mehrheit der CSV Dateien in Verwendung. Aber es gibt auch Dateien die pro Zeile unterschiedlich viele Spalten (z.B. je nach Typ des Datensatzes) ausgeben. Um diese speziellen CSV Dateien zu unterstützen gibt es den CSVVAR reader, der mit variablen Spaltenanzahl pro Zeile umgehen kann. XLS / XLSX ------------------------------------------------------------------------------------------------------------------------ NCDiff unterstützt sowohl das alte Microsoft Offics ``.xls`` Format (beginnend mit Excel 2.0) als auch die neuere ``.xlsx`` Version die mit Excel 2010 eingeführt wurde. XML ------------------------------------------------------------------------------------------------------------------------ Sollte es sich bei einem oder beiden Teilen eines Vergleichs um XML Dateien handelt wird das hierarchische XML Format in das tabellarische CSV Format umgewandelt. Die Transformation erfolgt über einen generischen Algorithmus der sowohl mit Elementen als auch Attributen umgehen kann. Es wird davon ausgegangen das sich die grundlegenden Struktur der XML Datei wiederholt! Ein Datensatz der aus der XML Struktur extrahiert wird muss sich über einen eindeutigen Schlüssel identifizieren lassen. Solle keine sich wiederholende Struktur vorliegen kann NCDiff das XML nicht verarbeiten. Dabei wird jedes vorgefundene Element bzw. Attribut als eigenständige Spalte in der Tabelle abgebildet. Die eigentlichen Daten definieren sich aus den jeweiligen Werten der Elemente bzw. Attribute. Eine Konvention für XML Dateien ist das Spalten in der resultierenden CSV Datei nach dem Format ``[|]_`` angelegt werden. Beispiel für die Namensfindung innerhalb einer XML Datei: .. code-block:: xml 123 4321 2014/04/21 12:00:00 543 654 928 2013/04/21 12:00:00 999 Transformation der XML Datei in eine tabellarische Datenstruktur ============ =============== =========== ==================== ============ =========== [1|0]_TRADE; [2|0]_TRADENBR; [2|0]_CPTY; [2|0]_CTIME ; [2|1]_isUTC; [2|0]_TRADE ; 123 ; 4321 ; 2014/04/21 12:00:00; True ; 543 ; 654 ; 928 ; 2013/04/21 12:00:00; False ; 999 ============ =============== =========== ==================== ============ =========== Um eine Indikation zu haben wo sich ungefähr der gefundenen Unterschied aus der originalen XML-Datei befinden, wird im „Old/New“-Data Sheet die Spalte: XmlFileLines angezeigt. In dieser Spalte sind die Nummern der Linien angegeben wo sich das auslösende XML Element befunden hat. .. image:: img/vergleichsformate_xml.png DIR (Dateisystem) ------------------------------------------------------------------------------------------------------------------------ Beim Vergleich von Verzeichnisbäumen werden rekursiv folgende Informationen zu jedem Dateisystemobjekt eruiert und in einer tabellarischen Form abgelegt. Nachfolgend eine Übersicht über die Spalten die im Zuge eine Verzeichnisabgleichs in einer CSV Datei abgelegt werden. Als ``oldKeyColumns`` bzw. ``newKeyColumns`` bietet sich hier eine Kombination aus ``ABSPATH`` und ``NAME`` an. +-----------+----------------------------------------------------------------------------------------------------------+ | Spalte | Kurzbeschreibung | +===========+==========================================================================================================+ | NAME | Name der Datei bzw. des Verzeichnisses (ohne Pfad, inklusive Extension) | +-----------+----------------------------------------------------------------------------------------------------------+ | ABSPATH | Absolute Pfad der Datei bzw. des Verzeichnisses innerhalb des jeweiligen Laufwerks | +-----------+----------------------------------------------------------------------------------------------------------+ | RELPATH | Relativer Pfad der Datei bzw. des Verzeichnisses zum jeweiligen Start-Verzeichnis des Vergleichs | +-----------+----------------------------------------------------------------------------------------------------------+ | EXTENSION | Erweiterung der Datei. Die letzten x Zeichen nach dem letzten Punkt in einem Dateinamen | +-----------+----------------------------------------------------------------------------------------------------------+ | TYPE | FILE, DIRECTORY, LINK | +-----------+----------------------------------------------------------------------------------------------------------+ | DEPTH | Rekursionsebene beginnend bei 1 | +-----------+----------------------------------------------------------------------------------------------------------+ | SIZE | Größe der Datei in Byte | +-----------+----------------------------------------------------------------------------------------------------------+ | PERM | Berechtigungen in POSIX Format (xrwx--x--) | +-----------+----------------------------------------------------------------------------------------------------------+ | CTIME | Datum + Zeit wann die Datei bzw. Verzeichnis erstellt wurde (ISO Format) | +-----------+----------------------------------------------------------------------------------------------------------+ | ATIME | Datum + Zeit wann die Datei bzw. Verzeichnis zum letzten mal gelesen wurde (ISO Format) | +-----------+----------------------------------------------------------------------------------------------------------+ | MTIME | Datum + Zeit wann die Datei bzw. Verzeichnis zum letzten mal verändert wurde (ISO Format) | +-----------+----------------------------------------------------------------------------------------------------------+ | USER | Besitzer der Datei bzw. des Verzeichnisses | +-----------+----------------------------------------------------------------------------------------------------------+ | GROUP | Gruppe der Datei bzw. des Verzeichnisses | +-----------+----------------------------------------------------------------------------------------------------------+ | HASH | Hashwert einer Datei (sha1) | +-----------+----------------------------------------------------------------------------------------------------------+ TAR ------------------------------------------------------------------------------------------------------------------------ Die Daten die sich innerhalb eines (TAR) Archivs befinden gestalten sich grundsätzlich sehr ähnlich zu Daten die beim Vergleich von Dateisystemobjekten ermittelt werden können. Daher orientiert sich das Format eines TAR Abgleichs sehr stark am Format eines Verzeichnisabgleichs. +-----------+----------------------------------------------------------------------------------------------------------+ | Spalte | Kurzbeschreibung | +===========+==========================================================================================================+ | NAME | Name der Datei bzw. des Verzeichnisses (ohne Pfad, inklusive Extension) | +-----------+----------------------------------------------------------------------------------------------------------+ | PATH | Absoluter Pfad der Datei bzw. des Verzeichnisses innerhalb des TAR Archives | +-----------+----------------------------------------------------------------------------------------------------------+ | EXTENSION | Erweiterung der Datei. Die letzten x Zeichen nach dem letzten Punkt in einem Dateinamen | +-----------+----------------------------------------------------------------------------------------------------------+ | TYPE | FILE, DIRECTORY, LINK | +-----------+----------------------------------------------------------------------------------------------------------+ | DEPTH | Rekursionsebene beginnend bei 1 | +-----------+----------------------------------------------------------------------------------------------------------+ | SIZE | Größe der Datei in Byte | +-----------+----------------------------------------------------------------------------------------------------------+ | PERM | Berechtigungen in POSIX Format (xrwx--x--) | +-----------+----------------------------------------------------------------------------------------------------------+ | MTIME | Datum + Zeit wann die Datei bzw. Verzeichnis zum letzten mal verändert wurde (ISO Format) | +-----------+----------------------------------------------------------------------------------------------------------+ | USER | Besitzer der Datei bzw. des Verzeichnisses | +-----------+----------------------------------------------------------------------------------------------------------+ | GROUP | Gruppe der Datei bzw. des Verzeichnisses | +-----------+----------------------------------------------------------------------------------------------------------+ | HASH | Hashwert einer Datei (sha1) | +-----------+----------------------------------------------------------------------------------------------------------+ Bei einer „reinen“ TAR (Tape Archive) Datei handelt es sich grundsätzlich um ein unkomprimiertes Dateiformat. TAR Dateien treten aber sehr häufig in Kombination mit einem zusätzlichen Kompressionsverfahren auf. Nachfolgend erfolgt eine Auflistung der unterstützen TAR Formate: +-----------+----------------------------------------------------------------------------------------------------------+ | Format | Kurzbeschreibung | +===========+==========================================================================================================+ | TAR | Unkomprimierte TAR Datei | +-----------+----------------------------------------------------------------------------------------------------------+ | TAR.GZ | TAR Datei die mit GZip komprimiert wurde | +-----------+----------------------------------------------------------------------------------------------------------+ | TAR.BZ2 | TAR Datei die mit BZip2 komprimiert wurde | +-----------+----------------------------------------------------------------------------------------------------------+ Sollte das angegebene TAR Dateiformat nicht zum tatsächlichen Komprimierungsverfahren passen versucht der NCDiff TAR Reader das Komprimierungsformat selbständig herauszufinden. Dazu wendet er folgende Reihenfolge an: 1. Transparente Komprimierung 2. Komprimierung in GZip 3. Keine Komprimierung 4. Komprimierung in BZip2 Sollte die Abarbeitung dieser Reihenfolge zu keinerlei Erfolg führen wird die Verarbeitung abgebrochen. SQL ------------------------------------------------------------------------------------------------------------------------ Das SQL Format ermöglicht die Abfrage von Daten aus relationalen Datenbanken mittels der Structured Query Language (SQL). Die Daten werden mittels SELECT Abfrage in Blöcken direkt über eine Datenbankverbindung abgefragt. Zur Abfrage können Namen von Tabellen, Views oder selbst geschriebene select Abfragen verwendet werden. Für die Spaltennamen werden automatisch die Spaltennamen aus dem Ergebnis der Abfrage verwendet, es sei denn ``oldHasHeader/newHasHeader/bothHasHeader`` wird auf FALSE gesetzt. Tabellen direkt auf dem Datenbankserver zu vergleichen, ohne die Daten zu übertragen zu müssen, ist nicht möglich. Nach der Abfrage werden die Ergebnisse in Zeichenketten konvertiert und wie bei einer CSV Datei als Text sortiert. Um zu sehen wie die ausgelesenen Daten im Sortier-Zwischenergebnis aussehen kann der Parameter ``keepTempFiles = TRUE`` gesetzt werden. pyodbc ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ Zum Zugriff auf Datenbanken wird ein Treiber der die `Python Database API Spectification 2.0 `_ unterstützt erwartet. Serienmäßig wird von Python lediglich die sqlite3 Datenbank unterstützt. Für den Zugriff auf andere relationale Datenbanken wird für gewöhnlich ODBC verwendet. Das Python Modul `pyodbc `_ liefert Unterstützung für den Zugriff auf ODBC via Python, muss aber gesondert installiert werden um zur Verfügung zu stehen. Zur technischen Überprüfung der pyodbc Installation kann man folgende Befehle absetzen. 1. Laden des ``pyodbc`` Moduls. Hier darf keine Fehlermeldung erscheinen, falls doch dann passt das Modul nicht zur Python Version .. code-block:: python C:\>python Python 2.6 (r26:66721, Oct 2 2008, 11:06:43) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import pyodbc Hier darf keine Fehlermeldung kommen 2. Überprüfung der verfügbaren ODBC Datenbank Treiber. Das Ergebnis ist eine Liste mit den Namen aller auf dem Betriebssystem installierten ODBC Treiber die von ``pyodbc`` verwendet werden können. Falls hier Einträge fehlen, dann passt vermutlich die Bit-Zahl des ODBC Treibers mit der Bit-Zahl der Python Version nicht zusammen. .. code-block:: python C:\>python Python 2.6 (r26:66721, Oct 2 2008, 11:06:43) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import pyodbc >>> print pyodbc.drivers() ['SQL Server', 'SQL Server Native Client 10.0'] # Das ist die ODBC Treiberliste Windows """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Unter Windows muss pyodbc mit der gleichen Visual Studio Version wie Python kompiliert werden, da sich das Modul ansonsten nicht laden lässt. Weiteres muss die Bit-Zahl von Python + pyodbc + ODBC Treiber übereinstimmen, denn ein 64Bit pyodbc kann keinen 32Bit ODBC Treiber verwenden und umgekehrt. Linux – RedHat EL6.5/CentOs 6.5 """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""" Um unter Linux eine Verbindung zu einem SQL Server aufzubauen werden folgende Schritte benötigt. 1. Vorbereitung der Umgebung (Installation u.a. von glibc, libgcc, libstdc++, krb5-libs, openssl, libuuid) .. code-block:: sh $ yum groupinstall “Development Tools” 2. Pyodbc Installation: .. code-block:: sh pyodbc-2.1.7-1.el6.x86_64.rpm - http://dl.fedoraproject.org/pub/epel/6/x86_64/pyodbc-2.1.7-1.el6.x86_64.rpm $ rpm -ivh pyodbc-2.1.7-1.el6.x86_64.rpm # Man könnte sich auch die Quellen herunterladen und selbst kompilieren. $ cd /var/tmp $ wget https://pyodbc.googlecode.com/files/pyodbc-3.0.7.zip $ unzip pyodbc-3.0.7.zip $ cd pyodbc-3.0.7 $ python setup.py build $ python setup.py install .. important:: Da wir Fehler im gcc bekommen haben, haben wir das Paket auf die schnelle einfach über RPM installiert. 3. Download der verschiedenen Quellen für die ODBC-Treiber .. code-block:: sh $ cd /var/tmp –msodbcsql-11.0.2270.0.tar.gz https://www.microsoft.com/en-us/download/details.aspx?id=36437 - unixODBC-2.3.0.tar.gz $ wget ftp://ftp.unixodbc.org/pub/unixODBC/unixODBC-2.3.0.tar.gz .. attention:: Im Paketmanager von CentOS ist eine neure Version des unixODBC verfügbar (yum install unixODBC). Allerdings ist diese nicht mit dem mscodbcsql kompatibel! 4. Installation der heruntergeladenen Quellen .. code-block:: sh $ tar xzf msodbcsql-11.0.2270.0.tar.gz $ cp unixODBC-2.3.0.tar.gz msodbcsql-11.0.2270.0/. $ cd msodbcsql-11.0.2270.0 $ ./build_dm.sh --download-url=file://unixODBC-2.3.0.tar.gz --prefix=/opt/unixODBC-2.3.0 $ ./install.sh verify $ ./install.sh install 5. Prüfung der erfolgreichen Installation .. code-block:: sh $ cat /etc/odbcinst.ini [ODBC Driver 11 for SQL Server] Description=Microsoft ODBC Driver 11 for SQL Server Driver=/opt/microsoft/msodbcsql/lib64/libmsodbcsql-11.0.so.2270.0 Threading=1 UsageCount=1 Wurde nun alles erfolgreich installiert und konfiguriert wurde kann der Treiber getestet werden. Zur technischen Überprüfung der ``pyodbc`` Installation kann man folgende Befehle absetzen. 1. Laden des pyodbc Moduls. Hier darf keine Fehlermeldung erscheinen, falls doch dann passt das Modul nicht zur Python Version .. code-block:: python C:\>python Python 2.6 (r26:66721, Oct 2 2008, 11:06:43) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import pyodbc Hier darf keine Fehlermeldung kommen 2. Neue Verbindung zur Testdatenbank von Front Arena herstellen. Zuvor sollte sichergestellt werden dass eine VPN Verbindung zum internen Netzwerk besteht. .. code-block:: python C:\>python Python 2.6 (r26:66721, Oct 2 2008, 11:06:43) [MSC v.1500 64 bit (AMD64)] on win32 Type "help", "copyright", "credits" or "license" for more information. >>> import pyodbc >>> con = pyodbc.connect('DRIVER={ODBC Driver 11 for SQL Server};SERVER=v022;UID=frontadmin;PWD=opus07') Hier darf kein Fehler auftreten