Delphi-PRAXiS
Seite 2 von 3     12 3      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Textdatei in Record Muster überführen (https://www.delphipraxis.net/172584-textdatei-record-muster-ueberfuehren.html)

Klaus01 12. Jan 2013 15:43

AW: Textdatei in Record Muster überführen
 
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  spruch, autor:string;
  dataSet : TSprueche; // dein Record
begin
  nr:=random(filesize(datei));
  seek(datei,nr);
  //*Wie kann ich nun das was er da geseeked hat als string unter spruch speichern und den autor
unter autor?
  read(datei,dataSet); // den record aus der Datei lesen
  spruch:= //alles vor ;
  spruch := dataSet.spruch;
  autor:= //das nach ;
  autot := dataSet.autor;
  memo1.Lines.Add(<spruch>+'von'+<autor>)
end;
Grüße
Klaus

mabstudent 13. Jan 2013 10:31

AW: Textdatei in Record Muster überführen
 
Danke für eure Hilfe, ich glaube ich bin jetzt sehr nah dran. Ich kann die Anwendung zumindest fehlerfrei starten. Betätige ich allerdings den Button1 erhalte ich folgende Fehlermeldung:

Projekt project1 hat Exception-Klasse >RunError(100)< ausgelöst.
In Zeile 76, dies wäre hier:

Code:
unit Unit1;

{$mode objfpc}{$H+}

interface

uses
  Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls;

type
  Tsprueche=record
    spruch:string[200];
    autor:string[50];
  end;

  { TForm1 }

  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;
    procedure Button1Click(Sender: TObject);
  private
    { private declarations }
  public
    { public declarations }
  end;

var
  Form1: TForm1;
  datei: file of Tsprueche;


implementation

{$R *.lfm}

{ TForm1 }

procedure txttodb(uebergabe:string);
var s:Tsprueche;  //variable für datei:file of Tsprueche
    spruch:string; //das was vorm ; steht
    autor:string;    //das was nach ; steht
    posi:integer; //position im string
    f:textfile;    //var für den textfile quelle.txt
    datei:file of Tsprueche; //var für den data base file ziel.db
begin
assignfile(f,'quelle.txt');  //Eingabe öffnen
reset(f);
assignfile(datei,'ziel.db');    //Ausgabe öffnen
rewrite(datei);
posi:=0;
while not eof(f) do
  begin
  readln(f,uebergabe);   //liest in f und schreibt in den string uebergabe
  posi:=pos(';',uebergabe); //Position von ; in uebergabe
  s.spruch:=copy(uebergabe,1,posi-1);    //das vorm ;
  s.autor:=copy(uebergabe, posi+ 1, MAXINT);   //nach ;
  write(datei,s);
  end;
closefile(f);
closefile(datei);
end;

procedure readRandomDataset(fileName: TFilename; var dataSet: TSprueche);
var
  datei : file of TSprueche;
  idx : longInt;
begin
  assignFile(datei,'ziel.db');
  if FileExists('ziel.db')
  then ReSet(datei)
  else ReWrite(datei);
  idx := random(sizeOf(datei));
  seek(datei,idx);
  read(datei,dataSet);
 [COLOR="Red"] closefile(datei); [/COLOR] *//Zeile 76: hier hab ich den RunError
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  dataSet : TSprueche;
  spruch, autor:string;
begin
  readRandomDataSet('ziel.db',dataSet);
  spruch:= dataSet.spruch;
  autor:= dataSet.autor;
  memo1.Lines.Add(spruch+'von'+autor);
end;
end.

DeddyH 13. Jan 2013 10:37

AW: Textdatei in Record Muster überführen
 
Relative Pfade sind schlecht. Außerdem: was willst Du denn aus einer Datei lesen, die Du gerade erst mit Rewrite angelegt hast? Wo wird txttodb aufgerufen, und wieso hat die einen Parameter, der intern als Variable benutzt wird, statt ihn gleich als Variable zu deklarieren?

mabstudent 19. Jan 2013 13:01

AW: Textdatei in Record Muster überführen
 
Eure Hilfe ist nochmal gefragt, da ich immernoch hier dran sitze :wink:

Aufgabenstellung hat sich insofern geändert, dass ich nun eine .txt Datei habe in der 11 Adressen in dieser Form stehen:
Nachname;Vorname;PLZ;Ort;Strasse;Hausnummer;usw...
Die Aufgabe an sich besteht immernoch darin die .txt datei in ein Record Muster zu überführen...

Hier mein Quelltext+Fragen:

Code:
const
  recordsize=1+20+20+5+20+30+3+4+9+1; //[B]*1[/B]
type
  Tperson=record
    Nachname:string[20];
    Vorname:string[20];
    PLZ:string[5];
    Ort:string[20];
    Strasse:string[30];
    Hausnummer:string[3];
    Vorwahl:string[4];
    Telefon:string[9];
  end;
*1: recordsize=.. war eine Vorgabe, was hat 2mal +1 zu bedeuten?


Code:
procedure person_linetorec(const Line: string; var person: Tperson);
 const
   semi=';';
 var
   semiPos: array [0..8] of integer;
   i:integer;
 begin
   FillChar(person, SizeOf(person), #0);
   FOR i:=0 TO 8 DO
   begin
   semiPos[i]:=Pos(semi, Line);
   person.nachname := Copy(Line, 0, semiPos[0]-1);
   person.vorname := Copy(Line, semiPos[0]+1,semiPos[1]-1);
   person.PLZ:= Copy(Line, semiPos[1]+1, semiPos[2]-1);
//usw. - wollte erstmal testen bevor ich hier weiter tippe...
   end;

 end;
Beim Testen mit Ausgabe über seek() einer beliebigen Person aus der Adressdatei auf ein Memo fällt auf:
- mal ist es richtig, mal falsch, je nach Länge von Nach,- und Vornamen der jeweiligen Person - erkenne aber leider keine Fehlersystematik. Hab ich bei der Copy(in,von,bis)-Sache was falsch gemacht?

Code:
procedure Konvertieren(const SrcFilename, DestFilename: string);
 var
   srcfile: textfile;
   destfile:file of Tperson;
   line:string;
   person:Tperson;
 begin
   assignfile(srcfile,'adressen.txt');
   reset(srcfile);
   assignfile(destfile,'adressen.db');
   rewrite(destfile);
   while not eof(srcfile) do
     begin
     readln(srcfile,line);
     person_linetorec(line,person);
     write(destfile,person);
     end;
   closefile(destfile);
   closefile(srcfile);
 end;
Nur zum Verständnis, die prozedur macht was sie machen soll. :-D

mkinzler 19. Jan 2013 13:04

AW: Textdatei in Record Muster überführen
 
Besser

Delphi-Quellcode:
recordsize := SizeOf( TPerson);

Furtbichler 19. Jan 2013 13:05

AW: Textdatei in Record Muster überführen
 
Zitat:

Zitat von mabstudent (Beitrag 1198770)
Also das in der Textdatei zwischen spruch und autor immer ein semikolon steht weiß ich ganz sicher.

Kannst Du gar nicht ganz sicher wissen, denn es gibt Lesefehler, Dateifehler usw.

Verlass dich nicht drauf. Du solltest dann so programmieren, das dein Programm nicht total abschmiert oder -schlimmer- total falsche Daten eingelesen werden.

mabstudent 19. Jan 2013 13:20

AW: Textdatei in Record Muster überführen
 
Zitat:

Besser

Code:
recordsize := SizeOf( TPerson);

danke, aber wo die 2mal +1 herkommt würde mich trotzdem interessieren :wink:

p80286 19. Jan 2013 21:32

AW: Textdatei in Record Muster überführen
 
Ich halte das für einen Fehler, da für jeden String ein Längenbyte dazu addiert werden müßte.
Also für string[20] ist die Länge 20+1.

Gruß
K-H

Furtbichler 20. Jan 2013 09:12

AW: Textdatei in Record Muster überführen
 
Zitat:

Zitat von p80286 (Beitrag 1199822)
Ich halte das für einen Fehler, da für jeden String ein Längenbyte dazu addiert werden müßte.
Also für string[20] ist die Länge 20+1.

Falsch. SizeOf(string[20]) ergibt 21. und SizeOf(TPerson) liefert die richtige Größe, denn SizeOf liefert immer den Speicherplatzverbrauch des Typen/Variablen.

Falsch ist es, die Größe selbst ausrechnen zu wollen, denn man weiß nicht, wie Delphi die Recordfelder ausrichtet. Dies ist abhängig von den Compilereinstellungen und ob man das Record als 'packed' deklariert hat.

Bummi 20. Jan 2013 11:03

AW: Textdatei in Record Muster überführen
 
@Furtbichler

Deine Antwort ist richtig, allerdings scheinst Du die Aussage von p80286 missverstanden zu haben.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:53 Uhr.
Seite 2 von 3     12 3      

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz