Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Zahlen aus text suchen! (https://www.delphipraxis.net/28684-zahlen-aus-text-suchen.html)

Nicolai1234 28. Aug 2004 09:06


Zahlen aus text suchen!
 
Ich möchte gerne aus einer Textdatei alle Zahlen auslesen!
Das Problem dabei ist, dass die Datei nicht immer gleich aufgebaut ist!
In der Datei sind von "den Machern" leider wahllos Absätze integriert worden, sodass ich nicht weiß, wie ich die zahlen auslesen kann! Im Endprodukt möchte ich einfach die Summe aller Zahlen aus dieser Datei haben!
Also: Wie kann ich das machen? Wie soll ich die datei einlesen? (tstringlist, memo, etc.) Was würdet ihr vorschlagen?
Danke
Nicolai
Eine solche datei sieht beispielsweise so aus!
Code:
Barta Zahlte 64998 Credits
Duke009 Zahlte 62941
Credits
Lama Zahlte 68544 Credits
cpils konnte nicht Zahlen
Ingo
Haller konnte nicht Zahlen
DarkManX konnte nicht Zahlen
DCGMaxx
Zahlte 9094 Credits
LuckyGeorge Zahlte 19008 Credits
blaw Zahlte
38455 Credits
Schummel Zahlte 47376 Credits

Sharky 28. Aug 2004 09:24

Re: Zahlen aus text suchen!
 
Hai Nicolai1605,

wir hatten schon einige Threads zum Thema "String in einzelne Worte aufteilen".
Wenn TStringList von Delphi6 schon mit DelmitedText arbeitet sollte das ganze mit einigen Zeile Code zu lösen sein.

sCrAPt 28. Aug 2004 11:00

Re: Zahlen aus text suchen!
 
Die eine Art währe alle Zahlen rauszunehmen, die andere alle Buchstaben. Mir gefällt letztere besser :stupid:
Man könnte es so in etwa machen:
Delphi-Quellcode:
var
  zeile, zeichen: integer;
  temp: string;
begin
  for zeile := 0 to memo1.Lines.Count - 1 do
  begin
    temp := memo1.Lines[zeile];
    for zeichen := 1 to length(memo1.Lines[zeile]) do
      if not (temp[zeichen] in ['0'..'9']) then
        temp[zeichen] := '*';
    memo1.Lines[zeile] := stringreplace(temp, '*', '', [rfreplaceall]);
  end;
Jetzt nur noch ne simple Schleife die Alles zusammenzählt :D

http://og4all.de/s.jpg, sCrAPt

Sharky 28. Aug 2004 11:06

Re: Zahlen aus text suchen!
 
Zitat:

Zitat von Sharky
...Wenn TStringList von Delphi6 schon mit DelmitedText arbeitet sollte das ganze mit einigen Zeile Code zu lösen sein.

Ich habe das jetzt mal so gemacht:
Delphi-Quellcode:
function AddiereZahlen (slText : TStringList) : Cardinal;
var
  slZeile : TStringList;
  summe : Cardinal;
  ndx1 : Integer;
  ndx2 : Integer;
  wert : Integer;
  code : Integer;
begin
  slZeile := TStringList.Create;
  summe := 0;
  try
    slZeile.Delimiter := ' '; // Trennzeichen
    for ndx1 := 0 to Pred (slText.Count) do // Alle Zeilen durchgehen
    begin
      slZeile.DelimitedText := slText.Strings[ndx1];
      for ndx2 := 0 to Pred (slZeile.Count) do // Jedes "Wort" durchgehen
      begin
        Val (slZeile.Strings[ndx2],wert,code); // In Integer umwandeln
        if (code = 0) then // Wenn Umwandlung gelungen
        begin
          summe := summe + wert; // Addieren
        end;
      end;
    end;
  finally
    slZeile.Free;
  end;
  result := summe;
end;

procedure TForm1.Button1Click(Sender: TObject);
var
  sl : TStringList;
  summe : Cardinal;
begin
  if (OpenDialog1.Execute) then
  begin
    sl := TStringList.Create;
    try
      sl.LoadFromFile(OpenDialog1.FileName); // Textdatei laden
      summe := AddiereZahlen(sl);
      Label1.Caption := IntToStr (summe);
    finally
      sl.Free;
    end;
  end;
end;

alcaeus 28. Aug 2004 11:08

Re: Zahlen aus text suchen!
 
Zitat:

Zitat von Nicolai1605
Code:
Barta Zahlte 64998 Credits
Duke009 Zahlte 62941
Credits
Lama Zahlte 68544 Credits
cpils konnte nicht Zahlen
Ingo
Haller konnte nicht Zahlen
DarkManX konnte nicht Zahlen
DCGMaxx
Zahlte 9094 Credits
LuckyGeorge Zahlte 19008 Credits
blaw Zahlte
38455 Credits
Schummel Zahlte 47376 Credits

Na dann sieh mal gleich in die 2. Zeile. Dort ist eine Zahl im Namen vorhanden, was dir am Ende ein Plus von 900000 (!) Credits bringen würde.
Eigentlich müsstest du in Einzelne Worte aufteilen ([oh]TStringList, DelimitedText[/oh]), dann immer das Wort "Credits" suchen und das Wort vorher rauskopieren (welches immer der Zahl entspricht).
Nicht berücksichtigt werden hier die Benutzer die nicht zahlen konnten, aber diese müssten eigentlich 0 Credits entsprechen und daher nichts ausmachen.

Greetz
alcaeus

[add]Der Hai schwimmt einfach zu schnell für mich :stupid: ;)[/add]

sCrAPt 28. Aug 2004 12:11

Re: Zahlen aus text suchen!
 
Ich verstehe Val() nicht ganz... Was macht das? Ich habs mit in der OH angesehen, aber irgendwie versteh ich das mit dem 2ten Parameter nicht :(

http://og4all.de/s.jpg, sCrAPt

Sharky 28. Aug 2004 12:18

Re: Zahlen aus text suchen!
 
Zitat:

Zitat von sCrAPt
Ich verstehe Val() nicht ganz... Was macht das? Ich habs mit in der OH angesehen, aber irgendwie versteh ich das mit dem 2ten Parameter nicht ...

Val () Versucht einen String in einen Zahl zu wandeln. Wenn die Umwandlung erfolgreich war steht in "code" 0. Ansonsten die Position im String bei der die Umwandlung gescheitert ist.
Delphi-Quellcode:
procedure TForm1.ButtonClick(Sender: TObject);
var
  str : String;
  wert : Integer;
  code : Integer;
begin
  str := '1548';
  Val (str,wert,code); // Code ist 0

  str := 'A1548';
  Val (str,wert,code); // Code ist 1

  str := '15c48';
  Val (str,wert,code); // Code ist 3

  str := '1548w';
  Val (str,wert,code); // Code ist 5
end;

scp 28. Aug 2004 13:32

Re: Zahlen aus text suchen!
 
Das sieht für mich nach einer Art Aufgabe aus. Wenn mans genau nimmt müsste man eigentlich nur nach den Zahlen suchen, die nach dem Wort "zahlte" erscheinen. Wenn man noch die Nichtzahler irgendwie auflisten muss, kann man ja die Namen vor "konnte nicht Zahlen" suchen. Dabei sind die Absätze dann völlig egal. Idee zur programmiertechnischen Umsetzung folgt.

EDIT:
So könnte man die Absätze (bzw. Zeilenende) richtig setzen:
Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  s : string;
  n, z : string;
  i : integer;
  wert, code, gesamt : integer;
begin
  s := Memo1.Lines.Text;
  s := StringReplace(s, #$0D#$0A, ' ', [rfReplaceAll, rfIgnoreCase]);
  s := StringReplace(s, 'Credits ', 'Credits'#$0D#$0A, [rfReplaceAll, rfIgnoreCase]);
  s := StringReplace(s, 'konnte nicht Zahlen ', 'konnte nicht Zahlen'#$0D#$0A, [rfReplaceAll, rfIgnoreCase]);
  Memo1.Lines.Text := s;
Jetzt hat man eine ordentliche Tabelle und kann das ganze parsen:
Delphi-Quellcode:
  gesamt := 0;
  for i := 0 to Memo1.Lines.Count-1 do
  begin
    If (Pos('konnte nicht Zahlen', Memo1.Lines[i]) > 0) then
    begin
      n := Copy(Memo1.Lines[i], 1, Pos('konnte nicht Zahlen', Memo1.Lines[i])-1);
      z := '0';
    end
    else
    If (Pos('zahlte' , LowerCase(Memo1.Lines[i])) > 0) and
       (Pos('Credits', Memo1.Lines[i]          ) > 0) then
    begin
      n := Copy(Memo1.Lines[i], 1, Pos('zahlte', LowerCase(Memo1.Lines[i]))-1);
      z := Copy(Memo1.Lines[i], Pos('zahlte', LowerCase(Memo1.Lines[i]))+length('zahlte'), Pos('Credits', Memo1.Lines[i])-(Pos('zahlte', LowerCase(Memo1.Lines[i]))+length('zahlte')));
    end
    else
    begin
      n := '';
      z := '0';
    end;

    n := Trim(n);
    z := Trim(z);
    Val (z,wert,code);
    If (code = 0) then
      Inc(gesamt, wert);

    // Hier könnte man das jetzt in ein ListView mit zwei Spalten
    // und ViewStyle vsReport übertragen
    {
    with ListView1.Items.Add do
    begin
      Caption := n;
      Subitems.Add(z);
    end;
    }
  end;

  Label1.Caption := IntToStr(gesamt);
end;
Das ganze ist natürlich nur für den Fall gedacht, dass die Schlüsselewörter "zahlte", "Credits" und "konnte nicht Zahlen" immer vorkommen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 21:35 Uhr.

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