wyszukiwanie w pliku TXT

0

witajcie Panowie i Panie, Panie i Panowie...

dzisiejsze pytanko dotyczy problemu: jak wyszukac w pliku txt linie zaczynajaca sie od znaku "-" i policzyc ile takich linijek wysteuje?
Drugie pytanko chyba analogiczne z tym ze wyszukanie ile razy wystepuje wpisana przez usera data np. "05.08.2004".
Jesli moglbym prosic o kodzik to byloby superasnie, ale cenne beda takze podpowiedzi.

ostatnie pytanie dotyczace mojego poprzedniego... jak wyswietlic z pliku txt szukana date i tekst ktory znajduje sie pod nia ? :(

mam nadzieje ze o zbyt wiele nie prosze :( jesl itak to sorrki!

pozdrowionka

0

..acha jeszcze drugie pytanie ;)

hmm wyszukac date, moze byc np. tak:

var
  TF: TextFile;
  dat4: string;
  licznik: integer;
begin
licznik := 0;

AssignFile(TF, 'plik.txt');
Reset(TF);

dat4 := '2004.31.5'    //do zmiennej przypisz date

While not Eof(TF) do
begin
  Readln(TF, linia);

  if Pos(dat4, linia) then goto jest_data;
  licznik := licznik +1;

end;

CloseFile(TF);

showmessage('Znaleziono dat: '+inttostr(licznik));
end;

....prawie to samo co wyzej...ale co tam ;)

0

używanie instrukcji goto nie jest zalecane od czasów języka basic zatem proponuje przerobić kod na taką postać:

var
  TF: TextFile;
  linia: String;
  i: integer;
begin
i:=0;
AssignFile(TF, 'c:\test.txt'); //tu wpisz ścieżkę do pliku
Reset(TF);

While not Eof(TF) do
begin
  Readln(TF, linia);
  if linia='' then continue;  // jeśli linia pusta to przejdz do następnego przejścia pętli while
  if pos('-',linia[1])=1 then //jeśli pierwszy znak to "-" wtedy...
    begin
      Memo1.Lines.Add(linia);
      Inc(i);
    end;
end;
CloseFile(TF);
Label1.Caption:=IntToStr(i)+' razy';
end;

w label1 pojawi się ile razy wystąpiła linia ze znakiem "-" na początku, a do memo1 wpisuje dany plik. aby ustrzec się błędu umieść jeszcze odpowiednie bloki w try... finally i wszystko bedzie ok.
co do drugiego pytania to zapisuj date w jakiś znacznikach, bo przecież nie będziesz wiedział kto co wpisał do danego pliku i jaką ta data będzie miała formę. Później już tylko Pos+Copy i masz date. :)

0

dzieki Wam bardzo... duzo mi pomogliscie ! chcialbym w niedlugim czasie tez tak moc innym pomagac i z glowy kod pisac :)
a jeszcze jedno... probuje znalezc date analogicznie do poszukiwan znaku "-" w czesci kodu:

 if linia='' then continue;  // jeśli linia pusta to przejdz do następnego przejścia pętli while
  if pos('09/08/2004',linia[1])=1 then //tutaj wisuje date zamiast wczesniejszego '-'
    begin
      src.Lines.Add(linia);
      Inc(i);

ale to nie zdaje rezultatu... co zrobic zeby szukal ciagu kilku znakow (=date) ? i wyswietlil date i tekst ktory znajduje sie pod data ? :(

0
 if linia='' then continue; 
  if pos('09/08/2004',linia)>1 then 
    begin
      src.Lines.Add(linia);
      Inc(i);
0

pos('09/08/2004',linia)>1

to na pewno nie da pożądanego rezultatu:
ShowMessage(IntToStr(Pos('tekst','tekstxxxxx')));

0
 if linia='' then continue; 
  if pos('09/08/2004',linia)>1 then 
    begin
      src.Lines.Add(linia);
      Inc(i);

kolejna pozytywna niespodzianka - wyswietla tekst ale nie bierze pod uwage calego ciagu "09/08/2004" :( widac ze przeszkadzaja mu slashe... probowalem zapisac date w formacie "09.08.2004" ale tez nic nie dalo... :(

btw. poza powyzszym problemem jak zrobic zeby wyswietlilo tresc ktora znajduje sie POD data az do momentu pojawienia sie lini "------------------" ?
oto jak zapisuje dane:
09/08/2004 ; 1534
to jest jakis tam tekst
ciag dalszy tekstu
itd. itd.

09/08/2004 ; 2245
kolejny tekst

wiem ze pomalu naduzywam waszej wyrozumialosci ale spac mi to nie daje :)

0

Coz powinienes powiedziec, ze w lini jest nie tylko data ;] Ale problem dalej jest prosty do rozwiazania. Zakladajac ze data bedzie zawsze w formacie xxxx a nie xx lub innym to mozna zrobic to tak:

var linia : string; // zmienna dla czytanej lini z pliku
     data : string; // zmienna dla odczytanej daty
     plik : text; // pliczek
     i : byte; // licznik
     data_do_szukania : string;  // ta zmienna ustaw sobie gdzies albo daj const :]
     znalezione : byte; // zmienna oznaczajaca ile znaleziono zgadzajacych sie dat

procedure czytanie_lini_ze_sprawdzeniem_czy_jest_ta_data;
begin
linia := ''; // zerujemy sobie
data := ''; // zerujemy sobie
readln(plik, linia); // czytamy linie
for i:=1 to 8 do // wycinamy pierwszych 8 znakow 
     data := data + linia[i]; // czyli tylko nasza date ... zas godzine olewamy
if data = data_do_szukania then inc(znalezione); 
end;                                                               

Na samym koncu jest incrament zmiennej znalezione ale mozesz tam dac co potrzebujesz. Np. procedura do zczytania tekstu zaraz po tej dacie or smth. Najwiecej sie nauczysz probujac dojsc do czegos sam. I pamietaj ze ten kod porownuje jedna linie tekstu ... nic ponad to, a wiec jesli chcesz to wykozystac musisz to dac w repeacie. Najlepiej bedzie jesli przeczytasz to i zrozumiesz po czym napiszesz na podstawie tego wlasny algorytm. Doswiadczenie to w programowaniu bardzo wazna rzecz. Powodzenia :]

1 użytkowników online, w tym zalogowanych: 0, gości: 1