Announcement

Collapse
No announcement yet.

ASCII-Datei mit fester Länge

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • ASCII-Datei mit fester Länge

    Hallo zusammen,

    ich muss aus einer Interbase Datenbank verschiedene Informationen zusammentragen und diese dann als ASCII-Datei mit fester Länge in einem bestimmten Verzeichnis ablegen. Kann mir jemand sagen, wie ich in Delphi am besten diese ASCII-Datei mit fester Länge erzeugen kann?

    Vielen Dank!
    Uwe

  • #2
    Hallo Uwe,

    dumme Frage: Muß die Datei eine feste Länge haben, oder sollen die Felder in der Datei eine feste Länge haben und die Dateigröße ergibt sich dann aus der Anzahl der Datensätze (kann also variieren)?

    Grüße Joche

    Comment


    • #3
      Hallo Jochen,

      der Satz in der ASCII-Datei muss eine feste Länge haben.

      Grüsse Uw

      Comment


      • #4
        Tja, dann hoffe ich mal, dass der BCB und Delphi nicht so weit auseinander klaffen:

        Ich würde ein char[Größe Datensatz] (in Delphi möglicherweise Record) anlegen mit dem Füllzeichen vorbelegen und an den entsprechenden Stellen die Daten in den char einfügen. Dann den char über TFileStream in die Datei schreiben.

        Codebeispiele könnte ich nur in C++ geben.
        Stelle ich aber gerne bereit und es findet sich bestimmt auch jemand, der es nach Delphi portiert... Aber dafür würde ich dann ein paar Informationen zum Satzaufbau benötigen.

        Grüße Joche

        Comment


        • #5
          Hallo Jochen,

          nee wäre schon gut Codebeispiele in C++ zu bekommen. Wenn du also was hättest...

          Danke!

          Gruß Uw

          Comment


          • #6
            Wie ist denn der Satzaufbau?

            Grüße Joche

            Comment


            • #7
              Hallo Uwe,<BR><BR>
              für wirklich wenig E U ro's kann man eine super Export VCL von EMS-Hightech (EMS QuickExport) mit deutschen Resourcen erwerben.<BR><BR>
              Fran

              Comment


              • #8
                Hallo Jochen,
                na nehmen wir einfach mal ein paar:
                Name1, Name2, Str, PLZ, Ort

                Wenn es in Reality ein paar mehr werden oder anders heissen macht's auch nix...

                Gruß Uw

                Comment


                • #9
                  ok, wie Du willst, dann eben nur Codeschnippsel:

                  <PRE>
                  AnsiString asDatensatz;
                  AnsiString asFueller = " "; // ganz viele Spaces, wenn Space das Füllzeichen sein soll
                  AnsiString asName1; // mußt Du dann mit Daten versehen
                  int iName1Laenge = 25; // feste Feldlänge
                  AnsiString asName2;
                  int iName2Laenge = 25;
                  AnsiString asStr = 25;
                  int iStrLaenge
                  ...
                  asDatensatz = asName1 + asFueller.SubString(1, iNameLaenge - asName1.Length())
                  + asName2 + asFueller.SubString(iName2.Length() - asName2.Length() ...
                  + eventuell Zeichen für DS-Ende
                  </PRE>
                  Wenn Du auch ein Beispiel für den FileStream möchtest, mußt Du dich bis morgen gedulden, da kann ich was aus einem Projekt kopieren (ja, ich bin schon zu Hause ).

                  Grüße Jochen
                  &#10

                  Comment


                  • #10
                    Hallo nochmal,

                    hier noch das TFileStream Beispiel:
                    <PRE>
                    AnsiString asFileNameAndPath = "<Dateipfad und -name>";
                    TFileStream* myfs = NULL;
                    char* myfsbuf = NULL;
                    int myfsbuf_size = 1024; // hier Datensatzgröße verwenden
                    int myfsbuf_written;
                    try
                    {
                    try
                    {
                    myfs = new TFileStream(asFileNameAndPath, fmOpenWrite); // fmOpenWrite: Datei wird komplett überschrieben
                    myfsbuf = new char[myfsbuf_size + 1];
                    myfs->Position = 0;
                    do
                    {
                    //hier den Datensatz vorbereiten
                    strcpy(myfsbuf, asDatensatz.c_str());
                    myfsbuf_written = myfs->Write((void*) myfsbuf, myfsbuf_size);
                    // eventuell myfsbuf_written auswerten, um zu prüfen, ob der DS komplett geschrieben wurde
                    // Application->ProcessMessages(); // eventuell nötig, damit die Anwedung nicht 'agestürzt' aussieht (abhängig von der Datenmenge)
                    } while (/* solange noch Daten aufzubereiten sind */)
                    }
                    catch(...)
                    {
                    ShowMessage("Dateifehler...");
                    }
                    }
                    __finally
                    {
                    if (myfs)
                    delete myfs;
                    if (myfsbuf)
                    delete[] myfsbuf;
                    }
                    </PRE>
                    Grüße Joche

                    Comment


                    • #11
                      Uwe,

                      möglicherweise hilft Dir dieses Schnippselchen, das mit einem Textfile arbeitet...

                      <PRE>
                      var
                      F: TextFile;
                      begin
                      if FileExists(Dateiname) then ???

                      AssignFile(F, Dateiname);
                      Rewrite(F);

                      Write(F, RSPadRight('Hello World', ' ', 15));
                      Write(F, RSPadLeft('Feldinhalt2', ' ', 30));

                      CloseFile(F);
                      end;
                      </PRE>

                      Die Funktionen RSPadRight und RSPadLeft formatieren den übergebenen String mit dem gewünschten Füllzeichen auf die angegebene Länge:

                      <PRE>
                      function RSPadRight(S: String; Ch: Char; Len: Integer): String;
                      var
                      RestLen: Integer;
                      begin
                      // ***************************************
                      // rechtsbündig, mit Zeichen aufgefüllt
                      // Portions (c) Swiss Delphi Center
                      // ***************************************
                      Result := S;
                      RestLen := Len - Length(S);
                      if RestLen < 1 then Exit;
                      Result := StringOfChar(Ch, RestLen) + S;
                      end;

                      function RSPadLeft(S: String; Ch: Char; Len: Integer): String;
                      var
                      RestLen: Integer;
                      begin
                      // ***************************************
                      // String mit Länge Len,
                      // linksbündig, mit Char aufgefüllt
                      // Portions (c) Swiss Delphi Center
                      // ***************************************
                      Result := RSLeft(S, Len);
                      RestLen := Len - Length(S);
                      if RestLen < 1 then Exit;
                      Result := S + StringOfChar(Ch, RestLen);
                      end;

                      function RSLeft(S: String; Len: Integer): String;
                      begin
                      // ***************************************
                      // String mit Länge Len
                      // ***************************************
                      Result := Copy(S, 1, Len);
                      end;
                      </PRE>

                      So kannst Du die einzelnen Feldinhalte auf die gewünschte Länge bringen und hintereinander in das Textfile schreiben. Alle Felder zusammen ergeben dann eine Zeile des Textfiles, die immer die selbe Länge hat.

                      Solltest Du wirklich einzelne Zeilen in der Textdatei benötigen, musst Du am Ende jeder Zeile noch ein CR/LF schreiben.

                      HTH
                      Ralp

                      Comment


                      • #12
                        Hast du Erfahrung mit diesen Komponenten

                        Comment


                        • #13
                          Hi,<br><br>ein schnelles Beispiel...<br><PRE>
                          procedure TForm1.Button1Click(Sender: TObject);
                          var
                          ausgabe : ansistring;
                          F: TextFile;
                          begin
                          AssignFile(F, 'NEUDATEI.$$$');
                          Rewrite(F);
                          ausgabe := '';
                          ausgabe := SET_LEN('test1',10);
                          ausgabe := ausgabe + SET_LEN('test2',20);
                          ausgabe := ausgabe + SET_LEN('test3',40);
                          Write(F, ausgabe);
                          CloseFile(F);
                          end;

                          function TForm1.set_len(input:ansistring; laenge:integer):ansistring;
                          begin
                          Result := input;
                          if length(Result) = laenge then
                          exit;
                          if length(Result) > laenge then begin
                          Result := copy(Result,1,laenge);
                          exit;
                          end;
                          while length(Result) < laenge do
                          Result := Result + ' ';
                          end;</PRE><br>Michae

                          Comment

                          Working...
                          X