Daten in Dateien schreiben und lesen

Das Lesen und Schreiben von Daten in Dateien (z. B. in sequenziellen oder CSV-Dateien) ist mit dem Lesen und Schreiben von Datensätzen in jeder anderen Datenquelle vergleichbar. Der Prozess, mit dem die Verbindung zur Datenquelle hergestellt wird, ist hier jedoch anders und auf bestimmte Varianten der EGL-Datenzugriffsanweisungen beschränkt.

EGL lässt das Schreiben und Lesen von Daten in zahlreichen Dateitypen zu, zu denen auch indexierte Dateien, sequenzielle Dateien und CSV-Dateien (auch Datei mit Trennzeichen genannt) gehören. Diese Dateitypen unterscheiden sich hauptsächlich durch das Verfahren, mit dem Informationen in der Datei gespeichert werden. Der Prozess für das Lesen der Datei und das Schreiben von Daten in die Datei ist bei den einzelnen Typen ähnlich. Im vorliegenden Abschnitt werden sequenzielle Dateien und CSV-Dateien behandelt.

Voraussetzungen

Ressourcenzuordnung einrichten

Um eine Verbindung zu einer Datei herzustellen, müssen Sie zunächst einen Ressourcenzuordnungsabschnitt definieren, der auf diese Datei verweist. Die Datei selbst kann ein Datensatz oder auch eine Datei in Ihrem System sein. Im vorliegenden Beispiel wird eine lokale Datei verwendet.

  1. Öffnen Sie den Builddeskriptor des Projekts.
  2. Fügen Sie den Ressourcenzuordnungsabschnitt zum Builddeskriptor hinzu und öffnen Sie diesen Abschnitt im Buildabschnittseditor. Lesen Sie hierzu 'Ressourcenzuordnungsabschnitt zu einer EGL-Builddatei hinzufügen'.
  3. Fügen Sie im neuen Ressourcenzuordnungsabschnitt eine neue Zuordnung zu der Position hinzu, an der die sequenzielle Datei abgelegt werden soll:
    1. Klicken Sie im Ressourcenzuordnungsabschnitt auf die Schaltfläche Zuordnung hinzufügen. Unter Zuordnungselemente wird nun ein neuer Eintrag angezeigt.
    2. Geben Sie im Feld Dateiname des neuen Eintrags eine mnemonische Zeichenfolge für die sequenzielle Datei ein, die den EGL-Namensanforderungen entspricht (z. B. myFile). Dieses Feld ist nicht der Name der tatsächlichen Datei auf der Platte, sondern entspricht vielmehr dem Wert der Eigenschaft fileName für serielle Datensatzabschnitte, die diese Datei verwenden.
    3. Geben Sie im Feld System den Typ des verwendeten Systems an, z. B. win für Windows oder linux für Linux.
    4. Legen Sie für das Feld Dateityp die Einstellung seqws fest, damit ein sequenzieller Datensatz dargestellt wird.
    5. Legen Sie für das Feld systemName die vollständig qualifizierte Position der Datei fest. Bei einem Windows-Betriebssystem beispielsweise sollte das Feld systemName in etwa folgendermaßen festgelegt werden:
      C:\myFolder\myFile.dat
      Falls Sie auf eine nicht vorhandene Datei verweisen, erstellt EGL die Datei, wenn Sie Daten in die Datei schreiben wollen.

      Der Ressourcenzuordnungsabschnitt sieht wie folgt aus (wobei die Felder Ihre eigenen Werte enthalten):

      Abbildung des Ressourcenzuordnungsabschnitts

    6. Speichern und schließen Sie den Ressourcenzuordnungsabschnitt.
  4. Legen Sie als Wert für die Builddeskriptoroption resourceAssociations den Namen des Ressourcenzuordnungsabschnitts fest.
  5. Definieren Sie einen Datensatzabschnitt, um die Datensätze darzustellen, die in der Datei gespeichert werden. Wenn Sie eine sequenzielle Datei verwenden wollen, definieren Sie beispielsweise einen serialRecord-Abschnitt:
    record mySerialRecord type serialRecord
      10 myInteger  int;
      10 myChar     char(50);
    end
  6. Legen Sie für die Eigenschaft fileName den Wert des Feldes Dateiname im Eintrag des Ressourcenzuordnungsabschnitts fest:
    record mySerialRecord type serialRecord
        {fileName = "myFile"}
        10 myInteger  int;
        10 myChar     char(50);
    end

Nun können Sie den Datensatzabschnitt in Ihrem Code verwenden, um auf die sequenzielle Datei zuzugreifen.

Weitere Informationen zu Ressourcenzuordnungen enthält das EGL-Generierungshandbuch.

Daten in die Datei schreiben

Das Schreiben von Daten in eine Datei ähnelt dem Schreiben von Daten in eine beliebige andere Datenquelle.

  1. Öffnen Sie ein EGL-Programm oder einen anderen Logikabschnitt.
  2. Stellen Sie sicher, dass sich Ihr serieller Datensatz im Geltungsbereich befindet und der sequenziellen Datei zugeordnet ist (siehe oben unter 'Ressourcenzuordnung einrichten'). Möglicherweise müssen Sie eine Anweisung import verwenden, um den Datensatz in den Geltungsbereich zu bringen:
    import myProject.myData.mySerialRecord;
  3. Deklarieren Sie in einem EGL-Programm eine Variable, die auf Ihrem seriellen Datensatz basiert:
    variableRecord mySerialRecord;
  4. Fügen Sie Daten zu den Feldern in der neuen Variablen hinzu:
    variableRecord.myInteger = 45;
    variableRecord.myChar = "Hello!";
  5. Verwenden Sie eine geeignete EGL-Datenzugriffsanweisung (z. B. add), um den Datensatz in die Datei zu schreiben:
    add variableRecord;
  6. Speichern und generieren Sie das Programm und führen Sie es aus. Der neue Datensatz wird am Ende der sequenziellen Datei geschrieben.

Daten aus der Datei lesen

Das Lesen von Daten aus einer sequenziellen oder CSV-Datei ähnelt dem Lesen aus jeder beliebigen anderen Dateiquelle. Die Datensätze müssen jedoch nacheinander gelesen werden.

Im Allgemeinen wird die Anweisung get next verwendet, um einen einzelnen Datensatz zu lesen, und die Anweisung get, um mehrere Datensätze zu lesen (bei seriellen Datensätzen). In diesem Kontext beginnt die Anweisung get next beim ersten Datensatz in der sequenziellen Datei und liest die Datensätze nacheinander.

  1. Öffnen Sie ein EGL-Programm oder einen anderen Logikabschnitt.
  2. Stellen Sie sicher, dass sich Ihr serieller Datensatz im Geltungsbereich befindet und der sequenziellen Datei zugeordnet ist (siehe oben unter 'Ressourcenzuordnung einrichten'). Möglicherweise müssen Sie eine Anweisung import verwenden, um den Datensatz in den Geltungsbereich zu bringen:
    import myProject.myData.mySerialRecord;
  3. Deklarieren Sie in einem EGL-Logikabschnitt eine Variable, die auf Ihrem seriellen Datensatz basiert:
    variableRecord mySerialRecord;
  4. Rufen Sie mithilfe der Variablen einen Datensatz aus der sequenziellen Datei ab:
    get next variableRecord;
  5. Verwenden Sie die Daten aus der sequenziellen Datei:
    sysLib.writeStderr(variableRecord.myChar);
  6. Speichern und generieren Sie das Programm und führen Sie es aus. Das Programm liest die sequenzielle Datei und zeigt die Daten aus dem Datensatz in der Konsole an:
    Hello!

CSV-Dateien verwenden

Einer der Vorteile von CSV-Dateien ist die Tatsache, dass sie von Benutzern gelesen werden können. Einfaches Beispiel einer CSV-Datei:
123,yes,3/9/2007,Rahima
-1,no ,9/9/1999,Jorge
92,yes,,Ludmilla
Dieses Beispiel zeigt drei Datenzeilen, die jeweils vier Einzelinformationen enthalten. Jede Einzelinformation ist durch ein Zeichen, das Trennzeichen genannt wird, abgegrenzt. Im obigen Beispiel handelt es sich bei diesem Zeichen um ein Komma. Bitte beachten Sie, dass die dritte Einzelinformation in der dritten Zeile null ist; dies wird dadurch angegeben, dass sich zwischen den Trennzeichen keine Daten befinden. CSVRecord-Abschnitte behandeln jede dieser Einzelinformationen als Feld. Ein CSVRecord-Abschnitt für diese Datei würde folgendermaßen aussehen:
record CsvRec type CSVRecord
{
  fileName = "CSVFile",
  delimiter = ",",
  textQualifier = "\"",
  style = CsvStyle.quoted
}

  jobCode int;
  permStatus char(3);
  hireDate date?;
  firstName string;
end
Das Feld fileName erfüllt denselben Zweck wie 'serialRecord'. Es verweist auf ein Element in einem Ressourcenzuordnungsabschnitt, der auf eine Datei zeigt. Der CSVRecord-Abschnitt besitzt jedoch zusätzliche Eigenschaften. Die Eigenschaft delimiter gibt das Zeichen an, mit denen die Einzelinformationen voneinander getrennt werden (in diesem Fall ein Komma). Die Eigenschaften textQualifier und style gehören eng zusammen - diese Konfiguration gibt an, dass Zeichenfolgen in der Datei in Anführungszeichen gesetzt werden können, falls sie reservierte Zeichen enthalten. Weitere Informationen finden Sie unter CSVRecord-Stereotyp.
Falls Sie das obige Beispiel einer CSV-Datei in einer Datei gespeichert und ein Ressourcenzuordnungselement für den Verweis auf die Datei erstellt haben, könnten Sie diesen Datensatz verwenden, um Daten in der Datei mit einem Programm wie dem Folgenden zu lesen und zu schreiben:
program readCSV type BasicProgram {}
  
  oneRecord CsvRec;
  
  function main()
    
    //get the first record
    get next oneRecord;
    
    if (oneRecord is endOfFile)
      //if there are no records
      SysLib.writeStdout("This file is empty.");
    else
      while (oneRecord not endOfFile)
        //perform this action for each record found
        SysLib.writeStdout(oneRecord.firstName);
        get next oneRecord;
      end
    end
  end
  
end
Dieses Programm liest Daten aus der Datei auf dieselbe Weise wie bei den vorherigen Beispiele mit Verwendung des sequenziellen Datensatzes, also mithilfe der Anweisung get next. Mit der Anweisung add können Sie auf dieselbe Weise Daten in die Datei schreiben.

Feedback