Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi 32-stellige zahlen aus txt oder memo auslesen (https://www.delphipraxis.net/96240-32-stellige-zahlen-aus-txt-oder-memo-auslesen.html)

o0o 20. Jul 2007 15:18


32-stellige zahlen aus txt oder memo auslesen
 
hi leutz,...hoffe ich hab das in der richtigen kategorie^^

also ich will ein simples programm schreibn das aus einem mischmasch aus zahlen und buchstaben nur die 32-stelligen zahlen rausfiltert und diese speichert.

nur ich bin ein anfaenger und weiss echt nicht wie ich das hinbekommen soll:)

hoffe ihr koennt mir da weiterhelfen,...

thx im vorraus...o0o :cyclops:

DeddyH 20. Jul 2007 15:33

Re: 32-stellige zahlen aus txt oder memo auslesen
 
Willkommen in der DP.

Hab mal schnell was zurechtgeschustert, das kann man sicher noch optimieren.
Delphi-Quellcode:
procedure FilterZahlen(ein,aus: TStrings);
var i,j: integer;
    passt: Boolean;
    zeile: string;
begin
  aus.BeginUpdate;
  aus.Clear;
  for i := 0 to ein.Count - 1 do
    begin
      zeile := trim(ein[i]);
      passt := Length(zeile) = 32;
      if passt then
        for j := 1 to Length(zeile) do
          if not (zeile[j] in ['0'..'9']) then
            begin
              passt := false;
              break;
            end;
      if passt then
        aus.Add(zeile);
    end;
  aus.EndUpdate;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  FilterZahlen(Memo1.Lines,Memo2.Lines);
end;

inherited 20. Jul 2007 15:41

Re: 32-stellige zahlen aus txt oder memo auslesen
 
Du gehst jtzt allerdings davon aus, dass sie getrennt Zeilenweise vorhanden sind :)
Wie wäre es damit? :mrgreen: Ungetested hingepfuscht.
Ich benutze hier StrToIntDef, ich weiß allerdings nicht ob es schneller/sauberer ist, alle 32 Stellen auf 0..9 zu testen.

Delphi-Quellcode:
procedure FilterZahlen32{Das 32 ist irreführend :D} (rein: String; raus: TStrings);
var i: Integer;
begin
  raus.BeginUpdate;
  raus.clear;
  for i := 1 to length(rein) do
  begin
    s:=Copy(rein,i,32);
    if StrToIntDef(s,42)<>42 then
      raus.Add(s);
  end;
  raus.EndUpdate;
end;

DeddyH 20. Jul 2007 15:46

Re: 32-stellige zahlen aus txt oder memo auslesen
 
Zitat:

Zitat von inherited
Du gehst jtzt allerdings davon aus, dass sie getrennt Zeilenweise vorhanden sind

Das habe ich aus dem Threadtitel so interpretiert, ja ;)
StrToIntDef mit 32-stelligen Zahlen habe ich noch nie versucht.

halinchen 20. Jul 2007 15:50

Re: 32-stellige zahlen aus txt oder memo auslesen
 
Wenn, muss es dann nicht
Delphi-Quellcode:
procedure FilterZahlen32{Das 32 ist irreführend :D} (rein: String; var raus: TStrings);
heißen? (Ich meine das "var raus..." sonst legt es doch eine neue Instanz von TStrings an und kopiert den Inhalt, oder?

inherited 20. Jul 2007 15:58

Re: 32-stellige zahlen aus txt oder memo auslesen
 
TSTrings ist eine Klasse, wird also intern nur der Pointer übergeben, weshalb das so klappen müsste.

halinchen 20. Jul 2007 16:00

Re: 32-stellige zahlen aus txt oder memo auslesen
 
Aha, wieder was gelernt. :corky:

Namenloser 20. Jul 2007 18:41

Re: 32-stellige zahlen aus txt oder memo auslesen
 
Hi,

ich habe aus Interesse eben diese kleine Funktion geschrieben:
Delphi-Quellcode:
procedure findnumlength(input: string; output: TStrings; numlength: integer=32);
var
  i,j: integer;
  inputlen: integer;
begin
  inputlen := length(input);
  i := 1;
  while i <= inputlen do
  begin
    // die nächsten 32 Stellen prüfen
    j := 0;
    while (i+j<=inputlen) and (input[j+i] in ['0'..'9']) and (j<numlength) do
      inc(j);
    // Wenn alle 32 Stellen eine Ziffer waren, Zahl hinzufügen
    if j = numlength then
    begin
      output.Add(copy(input,i,numlength));
    end;
    // Vorspulen bis zur nächsten Zahl:
    while (not (input[i+j] in ['0'..'9'])) and (i+j<=inputlen) do
      inc(j);
    // zur nächstmöglichen Stelle Springen
    inc(i,j);
  end;
end;
Sie findet alle Zahlen mit x Stellen im "input"-String und gibt sie in "output" aus. Bei meinen Tests hat sie jedenfalls funktioniert. Wenn eine Zahl mehr Stellen als x Stellen hat, werden die ersten x Stellen gefunden. Ich hoffe man versteht den Satz trotz der ganzen Ixxe^^
Wenn die Stellenanzahl genau stimmen muss, also danach keine weiteren Zifefrn folgen müsste es wahrscheinlich reichen, bei "while (i+j<=inputlen) and (input[j+i] in ['0'..'9']) and (j<numlength) do" das " and (j<numlength)" wegzulassen.

o0o 20. Jul 2007 21:14

Re: 32-stellige zahlen aus txt oder memo auslesen
 
hi leutz,...ich danke euch vielmals dass ihr euch so die muehe gemacht habt und mir sooo viel text geschrieben habt :mrgreen:
haette nicht gedacht dass ich so viele antworten bekomme^^

naja ok ich geh mal schwer davon aus dass eure codeschnipsel keine fehler beinhalten und dass das problem an mir liegt dass ich es immer noch nicht gebacken bekomme...

ich habe jetzt einfach mal den schnipsel von NamenLozer genommen und versucht einzubauen,... aber ich bekomme es einfach nicht hin._.

ich bin einfach mal hingegangen und hab ne datei namens D.txt erstellt mit ein wenig text drinne und diese als string geladen um NamenLozers schnipsel benutzen zu koennen(weiss leider nich wie ichs anders machen koennte...)

nur wenn ich das ergebniss der suche per memo ausgeben will bekomme ich einen error:

[Error] Unit1.pas(69): Incompatible types: 'String' and 'TStrings'
[Error] Unit1.pas(14): Unsatisfied forward or external declaration: 'TForm1.Button1Click'
[Fatal Error] Project1.dpr(5): Could not compile used unit 'Unit1.pas'

habt ihr vllcht ne idee wie man es richtig macht?^^

hier mein jetziger source:

Delphi-Quellcode:
unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Memo1: TMemo;
    Memo2: TMemo;
    Button2: TButton;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure LoadStringFromFile(Filename: string; var LoadString: string);//Datei im string laden
var fs:TFileStream;
begin
  fs:=TFileStream.Create(('C:\D.txt'), fmOpenRead or fmShareDenyNone);
  SetLength(LoadString, fs.Size);
  if fs.size>0 then  
    fs.Read(LoadString[1], fs.Size);
  fs.Free;
end;

procedure findnumlength(input: string; output: TStrings; numlength: integer=32);//NamenLozers schnipsel
var
  i,j: integer;
  inputlen: integer;
begin
  inputlen := length(input);
  i := 1;
  while i <= inputlen do
  begin
    // die nächsten 32 Stellen prüfen
    j := 0;
    while (i+j<=inputlen) and (input[j+i] in ['0'..'9']) and (j<numlength) do
      inc(j);
    // Wenn alle 32 Stellen eine Ziffer waren, Zahl hinzufügen
    if j = numlength then
    begin
      output.Add(copy(input,i,numlength));
    end;
    // Vorspulen bis zur nächsten Zahl:
    while (not (input[i+j] in ['0'..'9'])) and (i+j<=inputlen) do
      inc(j);
    // zur nächstmöglichen Stelle Springen
    inc(i,j);
  end;
end;



procedure TForm1.Button2Click(Sender: TObject);//gewuenschte memo ausgabe
begin
findnumlength(Memo1.Lines);
end;

end.
thx fuer eure hilfe im vorraus :roll:

da o0o

HalloDu 20. Jul 2007 21:22

Re: 32-stellige zahlen aus txt oder memo auslesen
 
Zitat:

Zitat von o0o
[Error] Unit1.pas(14): Unsatisfied forward or external declaration: 'TForm1.Button1Click'

Das kommt, weil du im Interface noch eine Defintion von Button1Click hast, aber den nicht in der Implementation implementiert hast. Du musst also entweder Button1Click implementieren oder aus dem Interface-Teil löschen.

Zitat:

Zitat von o0o
[Error] Unit1.pas(69): Incompatible types: 'String' and 'TStrings'

Der zweite Fehler kommt davon, dass du findnumlength mit den falschen Parameter aufrufst. Die Prozedur erwartet midestens zwei und du hast nur ein TStrings Objekt für den ersten Parameter angegeben, wobei da der input String hingehört, und somit sagt Delphi das du versuchst ein TStrings Objekt in einen String zu quetschen. Die Lösung ist simpel: Gib beide Parameter an. Erst den Input, dann die TStrings (Memo1.Lines).

Hoffe geholfen zu haben.

[EDIT] 1. Zweiten Fehler erkannt 2. Schlusswort verschoben [/EDIT]


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:44 Uhr.
Seite 1 von 2  1 2      

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