Autor Beitrag
Easy
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 22.11.06 14:45 
hi

ich bräuchte mal euere hilfe.
ich muss für die schule ein programm zur norminalphrasenanalyse machen und ich hab aber nicht viel ahnung davon.
wie kann man denn aus einer textdatei die man in ein memo geladen hat jetzt alle zahlen entfernen so das nur noch die wörter da sind?
also ich hab die txt jetzt schon in ein memo geladen und jetzt wollte ich auf ein button klick legen, das es mir nur noch die wörter ohnen die zahlen in ein 2 memo schreibt.

ich hoffe ihr könnt mir helfen

lg easy
monster
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 51

Win XP
Delphi 2005 PE
BeitragVerfasst: Mi 22.11.06 15:30 
norminalphrasenanalyse?
Ich will gar nicht wissen was das ist. Oder...? Nein! :)

Kommt natürlich drauf an was das für ein Text ist. Ich geh mal davon aus, dass es ein normal lesbarer Text mit Wörtern ist. Handelt es sich ausschließlich um natürliche Zahlen? Wohl nicht.
Ich hab mal ein ähnliches Problem gehabt und es etwa so gelöst:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function interprete(token: string): byte;
var c: integer;
begin
  if token = '' then begin
    result := END_OF_LINE;
    exit;
  end;

  {...}  

  //maybe it's a number?
  result := NUMBER;
  for c := 1 to length(token) + 1 do begin
    if c = length(token) + 1 then exit;
    if (c = 1and (token[c] in ['-','+']) then break;
    if (token[c] in ['0'..'9']) = false then break;
  end;

  //everything I don't know is assumed to be a string
  result := TEXTSTRING;

end;


Der Funktion habe ich ein Token übergeben, also ein "Wort". Tokens werden durch andere Zeichen begrenzt (Satz-, Leerzeichen und Klammern). Das lässt sich auch alles durch zeichenweise Überprüfungen erledigen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
function getToken(index: integer; com: string): string;
var i, c: integer;
    tm: boolean;
    qm: boolean;
begin
  i := 1;
  qm := false;
  result := '';
  
  for c := 1 to length(com) do begin
    if (com[c] = '"'then
      if qm = false then qm := true else qm := false;

    if ((com[c] = ' 'or (com[c] = chr(8))) and (qm = false) then begin
      if tm = true then inc(i);
      tm := false
    end else tm := true;

    if (tm = true) and (com[c] <> '"'and (index = i) then
      result := result + com[c];
  end;
end;


In deinem Fall musst Du das wohl noch erweitern, meine Funktionen waren für eine einfache Skriptsprache gedacht und nicht für beliebigen Text. Außerdem behandelt die Routine "strings wie diesen" als ein Token, was bei dir ja auch nicht sein muss.

Eine leichtere Lösung weiß ich leider nicht.
Dragonclaw
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 196

Windows Vista
Delphi 7 Prof.
BeitragVerfasst: Mi 22.11.06 15:40 
Uff, das ist aber ziemlich kompliziert....

Geht auch einfacher und auch leicher zu verstehen.
Problem ist nur das die Kommatar nicht mit rausgelöscht werden, da die ja nicht nur in Zahlen vorkommen sonder auch in Sätzen.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
procedure TForm1.Button1Click(Sender: TObject);
var hilfe,ohnenummer :string;
    i,j : integer;
begin
for j := 1 to (Memo1.Lines.count) do
 begin
  ohnenummer := '';
  hilfe :=Memo1.Lines[j-1];
   for i := 1 to length(hilfe) do
    if (((ord(hilfe[i]) < 48OR (ord(hilfe[i]) > 57)) then ohnenummer := ohnenummer + hilfe[i];
   Memo1.Lines[j-1] := ohnenummer;
  end;
 end;
Easy Threadstarter
Hält's aus hier
Beiträge: 4



BeitragVerfasst: Mi 29.11.06 22:49 
Danke für euere Hilfe!
Grenzgaenger
Ehemaliges Mitglied
Erhaltene Danke: 1



BeitragVerfasst: Do 30.11.06 00:28 
hallo easy,

hast mal 'n bischen code... damit man sieht wie deine denkstrukturen sind.. danke...