Wątek przeniesiony 2015-07-24 12:57 z Delphi i Pascal przez olesio.

Podział tekstu na kawałki

0

Witajcie.
Jak w Delphi można wczytać linijka po linijce z komponentu memo i podzielić go potem na kilka "kawałków".

W konsolowej wersji C++ zrobiłem to funkcją substr, jak to wygląda w Delphi ??

2

Zawartość danej linijki TMemo jest we własności Lines[IndeksLiniiLiczonyOdZera]. Natomiast podzielenia danego tekstu względem separatora można dokonać takim kodem (rezultat będzie w obiekcie typu TStringList, czyli mając tekst na przykład 'najpierw|googluj|a|na|forum|pytaj|dopiero|w|ostatecznosci|po|samodzielnym|kombinowaniu' w zróconym TStringList o indeksie [0] mamy słowo najpierw, w [1] mamy googluj i tak dalej. W Delphi o ile kojarzę, nie ma gotowej funkcji na rozbicie stringu na częśći. Można kombinować ze StringListami i DelimtedText, ale zdaje się jest to tylko dla konkretnego znaku - separatora, a nie tekstu do separacji, który może być dłuższy niż jeden znak. Takze tekst dzielimy z użyciem funkcji Pos do wyszukania jego fragmentów, a później stosując Copy i/lub Delete.

function Explode(Str : string; Separator : string) : TStringList;
var
  X : integer;
begin
  Result := TStringList.Create;
  X := Pos(Separator, Str);
  while X > 0 do
  begin
    Result.Add(Copy(Str, 1, X - 1));
    if X <= Length(Str) then
    begin
      Str := Copy(Str, X + Length(Separator), Length(Str));
    end;
    X := Pos(Separator, Str);
  end;
  if Length(Str) > 0 then
  begin
    Result.Add(Str);
  end;
end;

Przykład użycia:

procedure TForm1.Button1Click(Sender : TObject);
var
  SL : TStringList;
begin
  SL := Explode('najpierw|googluj|a|na|forum|pytaj|dopiero|w|ostatecznosci|po|samodzielnym|kombinowaniu', '|');
  if SL.Count > 4 then
  begin
    ShowMessage(SL[4]);
  end;
  SL.Free;
end;

W okienku informacyjnym powinno się nam ukazać słowo forum. I wątek ten przenoszę do działu Newbie, ponieważ dotyczy banalnych podstaw języka. Na przyszłość pytania o tak banalne kwestie zadawaj we wspomnianym dziale, a nie tutaj.

1

Funkcja do podziału ciągu wejściowego na kawałki, na podstawie znaków separatora już istnieje - nazywa się ExtractStrings i także wynik ląduje w obiekcie typu TStringList.

0

No właśnie znaków separatora. Mi zależy na tym, aby konkretną liczbę znaków "przypisać" do danej zmiennej, i tak cały ciąg znaków (który też ma swoją określoną długość) :)

1

@Kremius - podaj przykładową zawartość pliku i dokładnie opisz co ma program zrobić, bo inaczej prędko nie dojdziemy do rozwiązania;


PS: @olesio, @Shalom - przez kilka dni nie będę się logował, bo szlag trafił mi kompa (chyba płyta główna padła); Nowa sztuka dotrze do mnie koło wtorku, więc do tego czas będziecie mieli więcej roboty w Newbie; Póki co piszę z obcego kompa i wolę się nie logować, ani tutaj, ani na e-maile - stąd piszę tutaj jako ~anonim; Przekażcie reszcie modów - dzięki z góry; @spartanPAGE i @Wizzie - pracujecie dalej, w środę mam nadzieję odezwę się i pogadamy co do TSI, bo mam świeżutki sposób parsowania, bez używania dodatkowej kolejki czy listy :]

0
Kremius napisał(a):

No właśnie znaków separatora. Mi zależy na tym, aby konkretną liczbę znaków "przypisać" do danej zmiennej, i tak cały ciąg znaków (który też ma swoją określoną długość) :)

No to taką rzecz dokonasz funkcją Copy. Podajesz z jakiego stringa, od którego znaku i ile znaków ma skopiować. Jeżeli chodzi jednak jeszcze o coś innego to podaj przykład tekstu i co chcesz z niego pobrać.

furious prog. nz.: ok, postaram/y się ogarnąć tutaj.

0

Tekst nie posiada określonych dzielników. Jest to zbiór przypadkowych (z puntu widzenia kogoś, kto nie wie o co chodzi) znaków. Oto przykład:
HDR0048100005O2SMP 150727084821
030|+|O2|GSX1300RAZL414 |102270|TUTAJ_JAKIS_TEKSTPLIKU(AV4) |1|Sales |JS1CK111600102270|0000|O|M|B|0000664|150809|C2|AV4| |GSX|1300RAZL414 |

Ilość znaków zawsze musi być taka sama, inaczej przesunięcie powoduje błędne wczytanie danych przez inny program. Powyżej także oddzieliłem znakiem | kolejne fragmenty programu.

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