Rozparsování řetězce – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Rozparsování řetězce – Delphi – Fórum – Programujte.comRozparsování řetězce – Delphi – Fórum – Programujte.com

 

oxidián0
Grafoman
21. 6. 2018   #1
-
0
-

Mám v souboru txt jeden řádek:

1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1

ten načtu a rozparsuju a ve výsledku  Self.FiltryCheckedList obsahuje jen dvě položky (
Self.FiltryCheckedList.count=2). Jak je to možné? Jak to opravit?
 

readln(f, Self.FiltryChecked );
Self.FiltryCheckedList := TStringList.create;
if ( length(Self.FiltryChecked)>0 ) then
     ExtractStrings([';'],[],PChar(Self.FiltryChecked), Self.FiltryCheckedList);


Self.FiltryCheckedList.count = 2 !!!
Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
21. 6. 2018   #2
-
0
-

#1 oxidián
duplicity, jsem ti to psal několikrát

jeden ze stringů bude "1" druhý bude prázdný řetězec

Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
21. 6. 2018   #3
-
0
-

Tak jsem zjistil, že extractstrings nepustí prázdné řetězce do výstupu... Čím to teda rozparsovat? Je na to funkce?

Nahlásit jako SPAM
IP: 78.45.195.–
oxidián0
Grafoman
21. 6. 2018   #4
-
0
-

Jak rozjet .Split?

Self.FiltryChecked.Split(';');

[Error] testy.pas(284): Record, object or class type required ... Self.FiltryChecked.
 

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
21. 6. 2018   #5
-
0
-

#3 oxidián
já na to mám v tý mojí knihovně Typ a funkci

TArrayOfString : array of string;  - stejné používání jako normální Array

function TextParser(separator, text: string): TArrayOfString;
var
  poz, cnt, lenSep: integer;
begin
  SetLength(result, 0);
  lenSep := length(separator);

///prázdný řetězec vrátí prázdné pole
  if length(text) = 0 then
    exit;            

//separátor prázdný nebo delší než text vrátí v poli (index 0) text
  if (lenSep = 0) or (lenSep > length(text)) then
  begin
    SetLength(result, 1);
    result[0] := text;
    exit;            
  end;

//nastavení délky pole na počet znaků řetězce, což je max. možný
//počet substringů, možná by se dalo použít na prázdný separátor, 
//kdy by se text rozsekal do pole znaků po 1
  SetLength(result, length(text));   
  cnt := 0;
  poz := 0;

  repeat

//prázdno za posledním separátorem
    if length(text) = 0 then
    begin
      result[cnt] := '';
      inc(cnt);
      break;
    end;
    
//zjisti pozici separatoru, když není další vlož do pole zbytek řetězce    
    poz := pos(separator, text);
    if poz = 0 then
      result[cnt] := text
    else
    begin
//tato podmínka je třeba kvůli více zn. separátorům
      if length(text) >= poz then   
      begin
//separátor na začátku, vlož prázdný
        if poz = 1 then
          result[cnt] := ''
        else
//jinak zkopíruj do pole začátek po separátor
          result[cnt] := Copy(text, 1, poz - 1);
      end;
//smaž začátek včetně celého separátoru
      delete(text, 1, poz + lenSep - 1);
    end;

    inc(cnt);        //inkrementace counteru pole
  until poz = 0;

//uprav-zmenši na skutečnou velikost pole
  SetLength(result, cnt);     
end;

jsou tam ošetřené snad všechny myslitelné situace, od víceznakových oddělovačů, po prázdné řetězce včetně prázdného za posledním oddělovačem a je to včetně duplicit.

EDIT: Okomentoval jsem pro tebe tu funkci, abys případně věděl co a jak to dělá

a přesunul upravil jsem 2 řádky jen pro přehlednost, funkční byla i původní verze.

Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
21. 6. 2018   #6
-
0
-

No jó, ale já nechci psát složitou funkci. Když tam už existuje ta funkce .Split, tak bych ji raději použil.

Nahlásit jako SPAM
IP: 78.45.195.–
MilanL+1
Grafoman
21. 6. 2018   #7
-
0
-

#6 oxidián
v tom splitu máš chybu separátor se zadává jako array tzn ...split([';']);

FiltryCheckedList : TArray<string>;    -  Otázkou je jestli tvoje verze Delphi podporuje TArray

FiltryCheckedList := FiltryChecked.Split([';']);

Nahlásit jako SPAM
IP: 91.139.9.–
MilanL+1
Grafoman
21. 6. 2018   #8
-
0
-

#7 MilanL
navíc nevím jak se to chová při prázdných hodnotách

funkci psát nemusíš použij (zkopíruj) si tu mojí, ti to dovolím, nelpím na autorských právech :D

Nahlásit jako SPAM
IP: 91.139.9.–
gna
~ Anonymní uživatel
1891 příspěvků
21. 6. 2018   #9
-
+1
-
Zajímavé

#6 oxidián
Na té funkci není nic složitého a kdybys občas něco vypotil, tak by ses možná něco naučil. Ale máš to štěstí, že nic psát nemusíš, protože to ten list už umí. A používej dokumentaci ke své verzi Delphi.

slist.Delimiter := ';';
slist.StrictDelimiter := true;
slist.DelimitedText := '1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1';
Nahlásit jako SPAM
IP: 213.211.51.–
gna
~ Anonymní uživatel
1891 příspěvků
21. 6. 2018   #10
-
0
-

#8 MilanL
A když jsi dopisoval ty komentáře, tak ti to vůbec nepřišlo divný? Proč je v blbé funkci na postupné hledání oddělovačů ŠEST IFů?

function split(str: string; sep: string): tstringlist;
var
    sl: tstringlist;
    seppos, sublen: sizeint;
begin
    sl := tstringlist.create;
    repeat
        seppos := pos(sep, str);
        sublen := seppos - 1;
        if sublen = -1 then
            sublen := length(str);
        sl.add(copy(str, 1, sublen));
        delete(str, 1, sublen + length(sep));
    until seppos = 0;
    split := sl;
end;
Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
21. 6. 2018   #11
-
0
-
Nahlásit jako SPAM
IP: 78.45.195.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 3 hosté

Podobná vlákna

řetězce — založil ench

řetězce — založil ench

[VB] řetězce — založil aTTix

Zmenšení řetězce? — založil DjeFFeCt

Ukládání řetězce — založil Alan

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý