CX_ASCII_FILE
Klassenhierarchie
- CX_CLASS
- CX_ASCII_FILE
Beschreibung:
Ein Objekt dieser Klasse bezieht sich auf eine ASCII-Datei, stellt Methoden zum Lesen und Schreiben sowie für einfache Dateioperationen zur Verfügung. (Für die Verwaltung von Dateien selbst steht die Klasse CX_FILE_INFO zur Verfügung).
Dateikodierung
Die Klasse unterstützt mehrere gängige Dateikodierungen (nicht nur ASCII).
Beim Lesen von Dateien mit bekannter Kodierung sollte die Kodierung vor dem Öffnen der Datei immer Lesen explizit gesetzt werden. Falls die Kodierung nicht bekannt ist, sollte DetectCodepage verwendet werden, um die Codepage (falls möglich) aus dem Dateiinhalt zu ermitteln.
Beim Schreiben von Dateien sollte immer die Kodierung explizit gesetzt werden, die von der empfangenden Dateischnittstelle definiert wurde. Falls nichts definiert wurde, sollte die UTF-8-Kodierung verwendet werden, die alle Zeichen effizient darstellen kann und von den meisten modernen Programmen unterstützt wird.
Achtung: Die voreingestellte Kodierung wurde ab Dll-Version 228586 von CP850 auf UTF-8 geändert.
Hinweis: Über den Befehl TransTable können Byte-Übersetzungstabellen für das Einlesen mittels Read angemeldet werden. Diese werden auf die eingelesenen Daten angewendet, BEVOR die Konvertierung aus der eingestellten Dateikodierung in die Kodierung des ClassiX-Systems (UTF-8) durchgeführt wird. Hierdurch lassen sich beliebige Codepages unterstützen - sogar ASCII-inkompatible wie EBCDIC!
Satzformate
Es werden sowohl variable Sätze sowie Sätze mit fester Länge und festen Datenpositionen unterstützt:
Format | Satzlänge (beim Lesen) | Datenfelder |
---|---|---|
fix | a) festen Wert vorgeben b) Wert 0 angeben - Endekennzeichen \r oder \n definiert Satzlänge - SetRecordFormat |
a) Länge vorgeben (Felder folgen unmittelbar nacheinander) b) Position und Länge vorgeben - SetRecordFormat |
variable | Kennzeichen für Satzende - SetRecordSeparator | Trennzeichen - SetFieldSeparator |
Default-Einstellung für Lesen: ist variable Satzlänge, das Satzende bestimmt NL, CR oder eine Kombination aus beiden.
Während der Benutzung einer Datei kann das Satzformat geändert werden, so dass beispielsweise zunächst Daten in variabler Form und dann in einer fixen Satzstruktur geschrieben werden können. Daher beherrscht diese Klasse beide Satzformate gleichzeitig.
Anwendungs-Beispiele:
- Im-/Export von Daten
- Datanorm-Schnittstelle
CSV-Import:
Da der Import von Daten im CSV-Format besonders oft vorkommt, sind hier einmal die Optionen aufgeführt, die beim CSV-Import beachtet werden sollten.
- SetFieldSeparator sollte für CSV in der Regel auf "," gesetzt werden, jedoch exportiert Microsoft Excel die Felder mit ";" als Trennzeichen. Im Zweifel muss hier in die Datei geguckt werden.
- Gemäß RFC 4180 dürfen Felder Trennzeichen und Zeilenumbrüche enthalten, wenn die Werte in Anführungszeichen eingeschlossen sind. Dieses Verhalten ist für CX_ASCII_FILE standardmäßig deaktiviert und muss per Aufruf von ContainsStrings aktiviert werden. Hierbei ist zu beachten, dass die Anführungssstriche dann strikt paarig sein müssen. Manche CSV-Exporte messen Anführungszeichen keine besondere Bedeutung bei, in dem Fall darf ContainsStrings nicht verwendet werden.
- Falls ContainsStrings verwendet wird, dann gibt es zwei Optionen, wie Anführungszeichen in einem Feld dargestellt werden sollen. ClassiX verwendet standardmäßig die Sequenz \" und der RFC 4180 legt hierfür "" fest. Falls Anführungszeichen innerhalb von Feldern vorkommen, dann sollte die Datei untersucht werden, um festzustellen, welcher Stil verwendet wird. Um den RFC-Konformen Stil zu verwenden, muss die Methode EscapeQuotesRFCConform aufgerufen werden.
- CSV-Dateien können auch Sonderzeichen, Umlaute & co. in Feldern enthalten. Um sicherzustellen, dass diese korrekt eingelesen werden, sollte DetectCodepage und SetCodepage verwendet werden oder die Datei in einem Editor wie Notepad++ geöffnet werden, damit dieser die Zeichenkodierung der Datei bestimmen kann und diese muss über einen der folgenden Aufrufe gesetzt werden.
- UTF8Code
- ANSICode (= Windows 1252)
- UTF16LittleEndianCode
- UTF16BigEndianCode
- UTF32LittleEndianCode
- CP850Code
Code-Beispiel:
Var(inputFile)
CreateTransObject(CX_ASCII_FILE) -> inputFile
"CX_ROOTDIR\\test.txt" inputFile Put(fileName)
do {
LocalVar(record)
inputFile Call(Read) Revert -> record
inputFile Call(Eof) if break
// record hier verarbeiten
} loop
inputFile Call(Close) // Datei schließen
181614 ist CX_ASCII_FILE iterierbar und das obige Beispiel kann wie folgt vereinfacht werden
Code-Beispiel:
CreateTransObject(CX_ASCII_FILE) -> inputFile
"CX_ROOTDIR\\test.txt" inputFile Put(fileName)
inputFile iterate {
LocalVar(record)
Revert -> record
// record hier verarbeiten
}
inputFile Call(Close) //Datei schließen
Funktion | MA* | Parameter | Rückgabe | Kurzbeschreibung |
---|---|---|---|---|
AcceptInvalidPackedDataFields | beim falsch gepackten Datenfeldern keine Fehlermeldung | |||
ANSICode | Setzen des ANSI-Zeichensatzes | |||
Append | Ausgabe an Datei anhängen | |||
BuildIndexFile | (INTEGER, INTEGER) | Aufbau einer Index-Datei | ||
CheckIndex | (INTEGER) | VECTOR | Statistik über Effektivität des Hash-Algorithmus. | |
Close | Schließen einer Datei | |||
ContainsStrings | gequotete Strings beim Lesen im variablen Satzformat besonders behandeln (keine Bedeutung für festes Satzformat und Schreiboperationen) | |||
CopyFile | (STRING, INTEGER) | Kopiert eine Datei an eine andere Stelle | ||
CP850Code | Setzen des ISO/CP850-Zeichensatzes | |||
Create | Datei erzeugen | |||
Delete | Löscht die Datei und deren Indexdatei | |||
DetectCodepage 228519 |
STRING | Versucht den Zeichensatz der Datei anhand des Dateiinhalts zu ermitteln. | ||
Eof | INTEGER | Testet das Dateiende | ||
EscapeQuotesRFCConform | Aktiviert RFC 4180 konforme Zeichenkettenbehandlung für CSV-Dateien | |||
Exists | (STRING) | INTEGER | Prüfen, ob eine bestimmte Datei existiert | |
FileExchange | Wechselt die Datei | |||
FileLength | INTEGER | Dateigröße in Bytes | ||
FilePos | INTEGER | Position des Dateizeigers | ||
GetDirInfo | (STRING) | CX_FILE_INFO | Rückgabe Verzeichnis-Informationen | |
GetFieldFromBuffer | (INTEGER) | STRING | Rückgabe eines bestimmten Feldes des Pufferbereichs | |
GetFileInfo | CX_FILE_INFO | Rückgabe Datei-Informationen | ||
IsOpen | INTEGER | Prüfen, ob die Datei geöffnet ist | ||
MoveFile | (STRING) | Verschiebt eine Datei aus einem Verzeichnis in das angegebene Verzeichnis. | ||
Open | Öffnen einer Datei | |||
PackedDataFields | (VECTOR) | in IBM-Format gepackte Datenfelder bestimmen | ||
Read | VECTOR | Lesen des nächsten Satzes | ||
ReadIntoBuffer | Lesen des nächsten Satzes in das Pufferbereich | |||
ReadVariableFieldsReplaceHexNull | (STRING) | VECTOR | Lesen des nächsten Satzes, wobei alle Null-Bytes durch den Parameter ersetzt werden. | |
Bis Dll-Version 228508 |
Synchronisation für parallelen Zugriff auf das gleiche CX_ASCII_File-Objekt | |||
ReformatRecord | (VECTOR, INTEGER) | Ändern eines festen Satzformates | ||
ReRead | VECTOR | VECTOR | Satz wird wiederholt gelesen | |
Seek | (STRING) | INTEGER | Suchen eines bestimmten Satzes | |
SetBufLength | (INTEGER) | Setzt die Pufferbereichgröße | ||
SetCodepage 228519 |
STRING | Setzt den Zeichensatz zum Lesen/Schreiben der Datei. | ||
SetFieldSeparator | (STRING) | Feld-Trenner festlegen | ||
SetRecordSeparator | (STRING) | Satz-Trenner festlegen | ||
SetKey | (INTEGER) | Schlüsselfeld festlegen | ||
SetLeftAdjusted | (INTEGER, STRING, STRING) | Linksbündiges Schreiben in den Pufferbereich | ||
SetMaxKeyLength | (INTEGER) | Schlüsselfeldlänge festlegen | ||
SetReadOnly | Schreibschutz setzen | |||
SetRecordFormat | (VECTOR, INTEGER, INTEGER) | Setzen eines festen Satzformates | ||
SetRecordSeparator | (STRING) | Satz-Trenner festlegen | ||
SetRightAdjusted | (INTEGER, STRING, STRING) | Rechtsbündiges Schreiben in den Pufferbereich | ||
SetSkipCRLF | (INTEGER) | INTEGER | CR/LF an Satzende ignorieren | |
SetSkipHexNull | INTEGER | INTEGER | Sätze bei Hex-Null abschneiden statt Fehlermeldung | |
Update | (VECTOR) | Verändern eines Satzes | ||
UpdateFromBuffer | Verändert einen Satz mit den Daten des Pufferbereichs | |||
UTF8Code | Setzt die Codepage auf UTF-8 | |||
UTF8BOMCode | Setzt die Codepage auf UTF-8 (mit Byte-Order-Mark) | |||
UTF16BigEndianCode | Setzt die Codepage auf UTF-16 (mit Big-Endian) | |||
UTF16LittleEndianCode | Setzt die Codepage auf UTF-16 (mit Little-Endian) | |||
UTF32LittleEndianCode 235593 |
Setzt die Codepage auf UTF-32 (mit Little-Endian) | |||
Bis Dll-Version 228508 |
Synchronisation für parallelen Zugriff auf das gleiche CX_ASCII_File-Objekt | |||
Write | (VECTOR) | Schreiben eines Satzes | ||
WriteByte | (INTEGER) | Schreiben eines Bytes in die Datei | ||
WriteFromBuffer | Schreibt den Pufferbereich als nächsten Satz | |||
ZonedDataFields | (VECTOR) | in IBM-Format gepackte Datenfelder bestimmen |
* MA = Member-Access-Funktion
Datenfeld | Typ | Referenz-Klasse | I* | Kurzbeschreibung |
---|---|---|---|---|
nameOfExchangeFile | STRING | siehe FileExchange | ||
fileName | STRING | Dateiname |
* I = Indizierbares Datenfeld
Modul | Kurzbeschreibung |
---|---|
dtausedt.mod | DTAUS Datei Editiermodul |