Announcement

Collapse
No announcement yet.

Linux Textdatei in dBase einlesen, Anders Satzende ?

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

  • Linux Textdatei in dBase einlesen, Anders Satzende ?

    Mein System : Delphi 5 Professional, Win98 SE, BDE.
    Zur Übernahme von Daten muß ich eine Textdatei mit fester Länge, in jeder Zeile ein Datensatz in eine dBase Tabelle einspielen. Ich benutze Assignfile u.s.w. Mit Textdateien von einem Win Rechner klappt auch alles. Nur von einem Linux Rechner aus nicht. Das Satzendezeichen soll anders sein. Kann ich dies einstellen?

    mit freundlichen Grüßen

    Jens Freitag

  • #2
    Hallo,

    das erinnert mich an meine Rechner-Anfangszeit (damals musste ich mich mit einer UNIX-Kiste der Firma UNISYS abquälen). In der UNIX-Welt ist es üblich, dass nur ein Zeichen für den Zeichenwechsel (CR) verwendet wird. Unter Windows ist jedoch die Kombination CRLF (Carrige Return + Line Feed) üblich.
    Vor Jahren habe ich dazu in einem <b>Delphi 1</b>-Projekt den folgenden Weg verwendet, um das fehlende Zeichen in der TXT-Datei nachzurüsten:
    <pre>
    (* Das CR-Zeichen von UNIX in ein CRLF-Zeichenpaar umwandeln. Da das
    Byte-weise Auslesen und Umwandeln zu langsam ist, wird hier ein
    2 kByte großer Block gelesen und konvertiert. *)
    procedure TKonvertForm.MakeCRLF;
    var
    fSource,
    fTarget : File;
    NumRead,
    NumWritten : Word;
    Buf : array[1..1024] of Char;
    ToBuf : array[1..2048] of Char;
    lByte : LongInt;
    szTmp : array[0..50] of Char;
    i, iYield,
    iToBuf : Integer;
    Ch : Char;
    begin
    if FileExists(szFUSIN) then
    begin
    if StrLen(szCRLF) < 5 then Exit;
    lByte:= 0;
    iYield:= 0;
    AssignFile(fSource, szFUSIN);
    Reset(fSource, 1); { Record size = 1 }
    AssignFile(fTarget, szCRLF); { Neue Ausgabedatei}
    Rewrite(fTarget, 1); { Record size = 1 }
    repeat
    BlockRead(fSource, Buf, SizeOf(Buf), NumRead);
    lByte:= lByte + NumRead;
    Inc(iYield);
    { alle 20 kByte Anzeige aktualisieren + Yield }
    if iYield = 20 then
    begin
    ByteLabel.Caption:= IntToStr(lByte);
    Application.ProcessMessages;
    iYield:= 0
    end;
    iToBuf:= 0;
    for i:= 1 to NumRead do
    begin
    Inc(iToBuf);
    Ch:= Buf[i];
    if Ch = #10 then
    begin
    ToBuf[iToBuf]:= #13;
    ToBuf[iToBuf+1]:= #10;
    Inc(iToBuf);
    Inc(NumRead)
    end
    else ToBuf[iToBuf]:= Ch
    end;
    BlockWrite(fTarget, ToBuf, NumRead, NumWritten);
    until (NumRead = 0) or (NumWritten <> NumRead);
    CloseFile(fTarget);
    CloseFile(fSource);
    { Dateigröße in Byte am Ende anzeigen }
    ByteLabel.Caption:= IntToStr(lByte);
    end
    else
    begin
    ShowMessage(LoadStr(7));
    bError := True
    end
    end;
    </pre&gt

    Comment


    • #3
      Sehr geehrter Herr Kosch,

      vielen Dank für die schnelle Hilfe. Ich mußte nur die Variablen NumRead und NumWritten von Word auf Integer umstellen, die Variablen szFUSIN und scCRLF als String deklarieren und das Umwandeln klappte. Vielleicht sollten Sie Ihr Programm unter 3.4. Tips und Tricks zum Thema Strings Ihres Buches Delphi Win32 Lösungen in der nächsten Ausgabe aufnehmen. Die Linux Themen werden zunehmen. Am letzten Freitag wurde ich von meinem ersten Kunden mit der Umstellung auf Linux überrascht.

      Mit freundlichen Grüßen

      Jens Freita

      Comment


      • #4
        Hallo,

        malen Sie den Teufel nicht an die Wand ;-) <br>
        Ich setze darauf, das sich irgendwann die Vernuft durchsetzt und LINUX realistisch bewertet wird

        Comment


        • #5
          Ich würde auf Linux-Seite die Datei mit dem tr (=translate). "Ersetze CR durch CR/LF". Ergibt unter Linux/Unix einen Einzeiler ist vor allem sauschnell. Die genaue Syntax ist mit "man tr" auf dem jeweiligen System zu erfragen.
          Stefa

          Comment

          Working...
          X