AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Textdatei in Record Muster überführen

Ein Thema von mabstudent · begonnen am 12. Jan 2013 · letzter Beitrag vom 21. Jan 2013
Antwort Antwort
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#1

AW: Textdatei in Record Muster überführen

  Alt 12. Jan 2013, 15:43
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
Klaus
  Mit Zitat antworten Zitat
mabstudent

Registriert seit: 13. Nov 2010
23 Beiträge
 
#2

AW: Textdatei in Record Muster überführen

  Alt 13. Jan 2013, 10:31
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.
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.666 Beiträge
 
Delphi 12 Athens
 
#3

AW: Textdatei in Record Muster überführen

  Alt 13. Jan 2013, 10:37
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?
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
mabstudent

Registriert seit: 13. Nov 2010
23 Beiträge
 
#4

AW: Textdatei in Record Muster überführen

  Alt 19. Jan 2013, 13:01
Eure Hilfe ist nochmal gefragt, da ich immernoch hier dran sitze

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.
  Mit Zitat antworten Zitat
mkinzler
(Moderator)

Registriert seit: 9. Dez 2005
Ort: Heilbronn
39.880 Beiträge
 
Delphi 11 Alexandria
 
#5

AW: Textdatei in Record Muster überführen

  Alt 19. Jan 2013, 13:04
Besser

recordsize := SizeOf( TPerson);
Markus Kinzler
  Mit Zitat antworten Zitat
Benutzerbild von p80286
p80286

Registriert seit: 28. Apr 2008
Ort: Stolberg (Rhl)
6.659 Beiträge
 
FreePascal / Lazarus
 
#6

AW: Textdatei in Record Muster überführen

  Alt 20. Jan 2013, 12:28
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?
recordsize soll die Größe von TPerson liefern, darum zweimal +1 für das Längenbyte. Damit es richig ist müßte in diesem Beispiel für jeden String einmal +1 eingefügt werden.

Wobei die "Packed"-Falle natürlich nicht beachtet wird. Ebenso ist es besser gleich mit Sizeof zu arbeiten.

Wenn mit den gemachten Vorgaben, das Programm wirklich funktioniert, dann ist das reines Glück!

Gruß
K-H
Programme gehorchen nicht Deinen Absichten sondern Deinen Anweisungen
R.E.D retired error detector
  Mit Zitat antworten Zitat
mabstudent

Registriert seit: 13. Nov 2010
23 Beiträge
 
#7

AW: Textdatei in Record Muster überführen

  Alt 21. Jan 2013, 13:14
Danke, verstanden.

Aber das Programm läuft immernoch nicht. Sieht jemand einen Fehler?
Ich möchte aus der erstellten record datei einen bestimmten record auslesen - mehr eigentlich nicht
Muss ich an die Datei vom Typ Tperson 'recadressen.??' eine Endung hängen?? Wenn ja, was??
Ich bekomme keinen Fehler, aber auch keinen Inhalt im Memo. ABER die Warnung, dass person nicht initialisiert wurde in Zeile (siehe Code).

Aktueller Code:
Code:
[...]

type
  Tperson=record
  nachname:string[20];
  vorname:string[10];
  plz:string[5];
  ort:string[20];
  strasse:string[20];
  hausnummer:string[5];
  vorwahl:string[5];
  telefon:string[10];
  end;

[...]

 const
   recordsize = sizeof(Tperson);
var
  Form1: TForm1;

[...]

function linetorec(var s:string):Tperson; //hier sollen später wenn person.nachname funktioniert die weiteren
const                                    //Eigenschaften von Tperson zugewiesen werden, d.h.
  semi = ';';                            //ich will den string bis zum ersten semikolon löschen und wieder
var                                      //über pos nach dem neuen ersten semikolon suchen, dann wieder
  semiPos: integer;                      //löschen usw.
  person: Tperson;

begin
  semiPos:=0;
  semiPos:=Pos(semi, s);
  person.nachname:= copy(s, 0, semiPos -1);
  result:=person;
end;



procedure TForm1.Button1Click(Sender: TObject);  //Konvertieren: inhalt textfile an record datei übergeben
                                             
var srcfile: textfile;
    destfile: file of Tperson;
    line: string;
    person: Tperson;
begin
  assignfile(srcfile,'adressen.txt');     //Quelle öffnen
  reset(srcfile);
  assignfile(destfile,'recadressen.dat'); //Ziel öffnen
  rewrite(destfile);
  memo1.clear;
  while not eof(srcfile) do
  begin
    repeat readln(srcfile, line)          //Zeile lesen
    until line <> '';                     //bis irgendwas in line drin ist
    linetorec(line);                      //aus der Zeile, person(Tperson) machen
                 
    write(destfile, person);              //die Zieldatei (record) beschreiben.*Warning: Local var person does
                                           //not seem to be initialized.
  end;
  closefile(destfile);
  closefile(srcfile);

end;

procedure TForm1.Button2Click(Sender: TObject); //destfile lesen + ins memo

var
    rec_pos: integer;
    anz_recs: integer;
    person: Tperson;
    destfile: file of Tperson;
begin
  rec_pos:=strtoint(edit1.text);                       //gewünschte Person aus Edit1 lesen
  anz_recs:=filesize('recadressen') div recordsize;    //grenzt die Eingabemögl. für Edit1 ein von 0..anz_recs
  label1.caption:=inttostr(anz_recs);
  assignfile(destfile, 'recadressen');                 //record Datei öffnen
  reset(destfile);
  seek(destfile, rec_pos);                             //an die gewünschte Stelle fahren und
  read(destfile, person);                              //Person x auslesen
  memo1.clear;
  memo1.lines.add(person.nachname+...);                //hier folgen später die weiteren Eigenschaften
  closefile(destfile);



end;

end.
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.784 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Textdatei in Record Muster überführen

  Alt 21. Jan 2013, 13:19
nun, wenn du die Datei unter einem bestimmten Namen speicherst (recadressen.dat)
solltest Du sie auch wieder unter dem gleichen öffnen.

Ich würde an Deiner Stelle beim Abspeichern und Laden den Pfad mit angeben.

Edit1:
 anz_recs:=filesize('recadressen') div recordsize; ist meines Erachtens falsch.

Bei typisierten Dateien gibt fileSize die Anzahl der Datensätze zurück und die die Dateigröße in Byte.

Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:41 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz