AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Textdatei in Record Muster überführen

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

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

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
 
#2

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
 
#3

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
 
#4

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
 
#5

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
 
#6

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
mabstudent

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

AW: Textdatei in Record Muster überführen

  Alt 21. Jan 2013, 13:41
Ganze Pfade eingeben klappt leider auch nicht.

Gebe ich filesize('recadressen') auf ein Label aus erhalte ich 1133.= das entspricht der Größe in byte
Gebe ich recordsize auf ein Label aus erhalte ich 103. = alle Stringlängen(20+10+5+20+20+5+5+10=95) + Anzahl Eigenschaften von Tperson(das sind 8)--> 95+8=103.

filesize() div recordsize also 11.

Ich habe 11 Personen in meiner Datei stehen. Kommt also zumindest hin.

Bedeutet das, dass meine Datei recadressen nicht richtig typisiert wurde?
  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:48
aus der Delphi Hilfe:

Zitat:
In Delphi code, call FileSize to determine the size of the file specified by the file variable F. The size is expressed as the number of records in a record file. Thus:

If the file is declared as a file of byte, then the record size defaults to one byte, and FileSize returns the number of bytes in the file.
The Reset procedure can set the record size (in bytes) when it opens the file. In this case, FileSize returns the number of records in the file.
Note: If the file is declared as an untyped file and you do not specify a record size when you call Reset, then FileSize assumes a record size of 128. That is, FileSize gives the number of bytes divided by 128.
To use FileSize, the file must be open. If the file is empty, FileSize(F) returns 0.
Delphi-Quellcode:
  rec_pos:=strtoint(edit1.text); //gewünschte Person aus Edit1 lesen
für Edit1 ein von 0..anz_recs
  assignfile(destfile, 'recadressen'); //record Datei öffnen
  reset(destfile);

  anz_recs:=filesize(destFile); //grenzt die Eingabemögl.
  label1.caption:=inttostr(anz_recs);

  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);
Grüße
Klaus
Klaus
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 12:32 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