![]() |
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 |
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. |
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:
Jetzt nur noch ne simple Schleife die Alles zusammenzählt :D
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; ![]() |
Re: Zahlen aus text suchen!
Zitat:
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; |
Re: Zahlen aus text suchen!
Zitat:
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] |
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 :(
![]() |
Re: Zahlen aus text suchen!
Zitat:
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; |
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:
Jetzt hat man eine ordentliche Tabelle und kann das ganze parsen:
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;
Delphi-Quellcode:
Das ganze ist natürlich nur für den Fall gedacht, dass die Schlüsselewörter "zahlte", "Credits" und "konnte nicht Zahlen" immer vorkommen.
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; |
Alle Zeitangaben in WEZ +1. Es ist jetzt 03:59 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