Entwickler-Ecke

Delphi Language (Object-Pascal) / CLX - wieder mal string verarbeitung


Sauger Chris - Mi 09.09.09 19:32
Titel: wieder mal string verarbeitung
huhu ich spiel gerade mal wieder mit den pos ,copy rum und zwar versuch ich meinen phpmyadmin dump zu filtern
sprich er soll nach einem tabel in der datei suchen "INSERT INTO `news_bot`"
und die darauf folgenden einträge zwischen ( und ) in eine memo komp. ausgeben
so code bis jetzt :)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
tabel := TStringList.Create;
tabel.LoadFromFile(filename);
for b := 0 to tabel.Count - 1 do
if (pos('INSERT INTO `news_bot`',tabel.Strings[b]) >0)  //nach dem tabel suchen
   (pos('VALUES',tabel.Strings[b]) >0then
begin                                              //wenn gefunden strings zwischen ( und ) ausgeben
lenge := Length(tabel.Strings[b]);
posi1 := pos('(',tabel.Strings[b]);
posi2 := pos(')',tabel.Strings[b]);
end;

Memo2.Lines.Add(copy(tabel.Strings[b],posi1,posi2));
end;


so jetzt zu meinem prob der dump sieht so in etwa aus


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
INSERT INTO `news_bot` (`news_id`,`user_id`, `user_name`, `user_news`, `user_email`,`news_date`) VALUES
('1','2','pepe','heute gibt es lecker kuchen usw...','support@localhost.de','09.09.2009'),
('2','2','pepe','heute gibt es nix','support@localhost.de','09.09.2009')
('3','2','pepe','heute gibt es ..','support@localhost.de','09.09.2009')
('4','2','pepe','heute gibt es kuchen usw...','support@localhost.de','09.09.2009')
('5','2','pepe','heute gibt es ...','support@localhost.de','09.09.2009')




jetzt gibt er mir in meiner memo wie soll es auch anderst sein die ersten strings zwischen ( ) aus ^^ genau das brauch ich nicht "(`news_id`,`user_id`, `user_name`, `user_news`, `user_email`,`news_date`)"

so geht es zwar aber er gibt mir nur die erste zeile aus :)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
tabel := TStringList.Create;
tabel.LoadFromFile(filename);
for b := 0 to tabel.Count - 1 do
if (pos('INSERT INTO `news_bot`',tabel.Strings[b]) >0)  //nach dem tabel suchen
   (pos('VALUES',tabel.Strings[b]) >0then
begin
tabel.Strings[b] := tabel.Strings[b+1];           //wenn gefunden strings zwischen ( und ) ausgeben
lenge := Length(tabel.Strings[b]);
posi1 := pos('(',tabel.Strings[b]);
posi2 := pos(')',tabel.Strings[b]);
end;

Memo2.Lines.Add(copy(tabel.Strings[b],posi1,posi2));
end;


die lösung ist warscheinlich so simpel wie der code aber ich komm einfach nicht drauf :-(



danke schon mal für eure hilfe =)))


Moderiert von user profile iconNarses: Topic aus Sonstiges (Delphi) verschoben am Do 10.09.2009 um 09:39
Moderiert von user profile iconNarses: Titel geändert.


FinnO - Mi 09.09.09 20:21

user profile iconSauger Chris hat folgendes geschrieben Zum zitierten Posting springen:



Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
tabel := TStringList.Create;
tabel.LoadFromFile(filename);
for b := 0 to tabel.Count - 1 do
if (pos('INSERT INTO `news_bot`',tabel.Strings[b]) >0and  //nach dem tabel suchen
   (pos('VALUES',tabel.Strings[b]) >0then
begin
tabel.Strings[b] := tabel.Strings[b+1];           //wenn gefunden strings zwischen ( und ) ausgeben
lenge := Length(tabel.Strings[b]);
posi1 := pos('(',tabel.Strings[b]);
posi2 := pos(')',tabel.Strings[b]);
end;

Memo2.Lines.Add(copy(tabel.Strings[b],posi1,posi2));
end;


die lösung ist warscheinlich so simpel wie der code aber ich komm einfach nicht drauf :-(



danke schon mal für eure hilfe =)))


Lannes - Do 10.09.09 00:16

Hallo,

wenn das 'and' fehlt wird das Prog überhaubt nicht gestartet = "Operator oder Semikolen fehlt"
Da aber die erste Zeile im Memo ausgegeben wird, denke ich das in dem gepostete Code Veränderungen vorgenommen wurden.

Mir fällt auf das die Code-Zeile "Memo2.Lines.Add(..." außerhalb des Schleife steht.
Also Code formatieren und Fehler finden:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
tabel := TStringList.Create;
tabel.LoadFromFile(filename);
for b := 0 to tabel.Count - 1 do
  if (pos('INSERT INTO `news_bot`',tabel.Strings[b]) >0and
     (pos('VALUES',tabel.Strings[b]) >0then
     begin
       tabel.Strings[b] := tabel.Strings[b+1];           
       lenge := Length(tabel.Strings[b]);
       posi1 := pos('(',tabel.Strings[b]);
       posi2 := pos(')',tabel.Strings[b]);
     end;
Memo2.Lines.Add(copy(tabel.Strings[b],posi1,posi2));
end;


Sauger Chris - Do 10.09.09 09:04

oh nene das and steht bei mir im source drin hab ich irgendwie gelöscht wo ich die kommentare hier eingefügt habe ^^ *peinlich


naja nach dem kaffee beschäftige ich mich mal weiter mit :)


jaenicke - Do 10.09.09 10:26

user profile iconSauger Chris hat folgendes geschrieben Zum zitierten Posting springen:
naja nach dem kaffee beschäftige ich mich mal weiter mit :)
Die Antwort hast du doch auch schon bekommen. Du greifst nach der Schleife noch auf die Schleifenvariable zu, deren Wert ist dort aber undefiniert. Meistens warnt da der Compiler auch an der Stelle...
user profile iconLannes hat folgendes geschrieben Zum zitierten Posting springen:
Mir fällt auf das die Code-Zeile "Memo2.Lines.Add(..." außerhalb des Schleife steht.
Also Code formatieren und Fehler finden:
[...]
Du hast deinen Quelltext nämlich leider nicht formatiert. Und dann brauchst du dich auch nicht wundern, wenn dir Fehler nicht auffallen... :roll:


Sauger Chris - Do 10.09.09 16:35

naja danke trozdem ich hab das nu so gelöst =)


Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
tabel := TStringList.Create;
finish := TStringList.Create;
tabel.BeginUpdate;
tabel.LoadFromFile(filename);
i := 0;
for b := 0 to tabel.Count - 1 do
if (pos('INSERT INTO `news_bot`',tabel.Strings[b]) > 0then  // nach dem string suchen wenn gefunden
begin   
i := b+1;                    //i = position von b + 1 weil die erste zeile nicht benötigt wird                 
found := true;               //found = true damit die while schleife los legen darf :)
end;

while Found do
begin
inc(i);                                            //string count um 1 erhöhen
  posi1 := pos('(',tabel.Strings[i]);              //position von ( ermitteln
  posi2 := pos(')',tabel.Strings[i]);              //position von ) ermitteln
  finish.Add(copy(tabel.Strings[i],posi1,posi2));  //ergebnis in Tstringlist schreiben
if pos(');',tabel.Strings[i]) <> 0 then            //wenn  ); im string gefunden wurde while schleife beenden mit
begin                                              //found = false
  found := false;
  Showmessage('Ich habe fertig');
  end;
end;


sieht zwar nicht so schön aus aber erfüllt seinen zweg =)


jaenicke - Do 10.09.09 17:25

Da fehlen noch die Ressourcenschutzblöcke.

Was du da jetzt machst, habe ich gerade keine Lust nachzuvollziehen, das sieht zu... komisch... aus. Du solltest endlich den Code ordntlich formatieren, damit man sieht was da passiert ohne erst ewig sich den anschauen zu müssen. Gemeint war einfach nur:

Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
  tabel := TStringList.Create;
  try
    tabel.LoadFromFile(filename);
    for b := 0 to tabel.Count - 1 do
      if (pos('INSERT INTO `news_bot`',tabel.Strings[b]) >0)  //nach dem tabel suchen
        (pos('VALUES',tabel.Strings[b]) >0then
      begin
        //tabel.Strings[b] := tabel.Strings[b+1];           //wenn gefunden strings zwischen ( und ) ausgeben
        lenge := Length(tabel.Strings[b]);
        posi1 := pos('(',tabel.Strings[b]);
        posi2 := pos(')',tabel.Strings[b]);
        Memo2.Lines.Add(copy(tabel.Strings[b],posi1,posi2));
      end;
  finally
    tabel.Free;
  end;
Denn sonst wird das nun einmal nicht in der Schleife bei jedem Fund ausgeführt.

Warum nennst du die Variable eigentlich tabel statt table? :lol:

//EDIT:
Ach ja, ganz wichtig, fällt mir grad auf...
Copy erhält als dritten Parameter die Anzahl der zu kopierenden Zeichen, siehe Hilfe oder Eingabehilfe...