AGB  ·  Datenschutz  ·  Impressum  







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

Zahlen aus text suchen!

Ein Thema von Nicolai1234 · begonnen am 28. Aug 2004 · letzter Beitrag vom 28. Aug 2004
Antwort Antwort
Nicolai1234

Registriert seit: 21. Feb 2004
1.008 Beiträge
 
Turbo Delphi für Win32
 
#1

Zahlen aus text suchen!

  Alt 28. Aug 2004, 10:06
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#2

Re: Zahlen aus text suchen!

  Alt 28. Aug 2004, 10:24
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.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
sCrAPt
(Gast)

n/a Beiträge
 
#3

Re: Zahlen aus text suchen!

  Alt 28. Aug 2004, 12:00
Die eine Art währe alle Zahlen rauszunehmen, die andere alle Buchstaben. Mir gefällt letztere besser
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

http://og4all.de/s.jpg, sCrAPt
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#4

Re: Zahlen aus text suchen!

  Alt 28. Aug 2004, 12:06
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von alcaeus
alcaeus

Registriert seit: 11. Aug 2003
Ort: München
6.537 Beiträge
 
#5

Re: Zahlen aus text suchen!

  Alt 28. Aug 2004, 12:08
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 [/add]
Andreas B.
Die Mutter der Dummen ist immer schwanger.
Ein Portal für Informatik-Studenten: www.infler.de
  Mit Zitat antworten Zitat
sCrAPt
(Gast)

n/a Beiträge
 
#6

Re: Zahlen aus text suchen!

  Alt 28. Aug 2004, 13:11
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
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.252 Beiträge
 
Delphi 2006 Professional
 
#7

Re: Zahlen aus text suchen!

  Alt 28. Aug 2004, 13:18
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;
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
scp

Registriert seit: 31. Okt 2003
1.120 Beiträge
 
Delphi 7 Personal
 
#8

Re: Zahlen aus text suchen!

  Alt 28. Aug 2004, 14:32
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.
  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:59 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