Odczyt z pliku niektórych wartości

0

Witam [niewinnosc]
Mam problem. Czy ktoś pomógłby mi w następującym problemie.
Plik text.txt, jest zapisany w postaci:

[code]
2003-10-21;2135;32,0;47,0;xx.x;4166;0;0;+12,34;+5,03;+1,62;+3,31;-12,04;-5,20;+x.xx;
[/code]
Jest to rejestr pliku, w którym zapisywane są różne wartości.
Problem polega na rozdziale tych wartości i odczytu konkretnych, pomiędzy każdą wartoscią jest znak ; (średnik).
Interesuje mnie 2 wartości - 3 i 4 licząc od lewej, czyli w tym przypadku:
[code]
2003-10-21;2135;32,0;47,0;xx.x;4166;0;0;+12,34;+5,03;+1,62;+3,31;-12,04;-5,20;+x.xx;
[/code]
32,0 oraz 47
Czy ma ktos pomysł jak to oddzielić ?
Proszę zostawić wskazówkę, np. w postaci kodu w Delphi - na forum albo skontaktować się ze mną

jas_dream
http://www.programmer.website.pl/
[email protected]

0

Trochę zakręcone :

tekst wrzucasz do stringa
czytasz kolejne znaki ze stringa i liczysz ile razy pojawił sie średnik
jeśli dwa razy, kopiujesz pozstałe znaki do innego stringa, aż do wystąpienia znaku innego niż cyfra - masz pierwszą wartość
czytasz staring aż do nastepnego średnika
i znów kopiujesz znaki - będziesz miał drugą wartość

0

...albo wrzucasz do stringa i:

var
  List: TSringList;
begin
  List := TStringList.Create;
  try
    ExtractStrings([';'], [], Text, List);
    // Tutaj w liscie masz dostęp do wszystkich wartości np.:
    // Caption := List[12]; czyli wartość numer 13 :)
  finally
    List.Free;
  end;
end;

Oczywiście zmienna Text to ten tekst z wartościami.

0

Oto moje wypociny:

function wyciagnij(Text: string; var S1, S2, S3: string): boolean;
var
  i, num, poz: integer;
begin
  i := Pos(';', Text);
  num := 1;
  poz := 0;
  while i<=length(text) do
  begin
    Inc(i);
    if (Text[i] = ';') or (Text[i] = ',')  then
    begin
      Inc(num);
      case num of
        2: poz := i + 1;
        3: begin
           s1 := Copy(Text, poz, i - poz);
           poz := i + 1;
           end;
        4: begin
           s2 := Copy(Text, poz, i - poz);
           poz := i + 1;
           end;
        5: begin
           s3 := Copy(Text, poz, i - poz);
           result := true;
           Exit;
           end;
      end;
    end;
  end;
end;

Funkcja jest zabezpieczona przed nieprawidłowym Text, więc jeżeli u Ciebie text to pewniak (zawiera conajmniej 5 znaków średnika lub przecinka), to można ją skrócić.

Możnaby też zrobić przy pomocy PosEx, ale algorytm byłby mniej wydajny i w dodatku kosztowałoby to dodanie do projektu całkiem sporego StrUtils.

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