Forum Delphi.cz

Delphi => Obecné => Téma založeno: vangog 20-09-2018, 22:57:54

Název: Jak na vyhledávání stringů?
Přispěvatel: vangog 20-09-2018, 22:57:54
Mám mapovací tabulku, soubor txt s názvy knih. Originál název nalevo, varianta názvu bez mezer vpravo. Zkrátím to:

1 Chronicles;1_chronicles
1 Kings;1_kings
1 Samuel;1_samuel
2 Chronicles;2_chronicles
2 Kings;2_kings
2 Samuel;2_samuel

Zadání je, že mám originál název knihy a potřebuju ho přeložit.

Načíst to do TStringList mi nepříjde ideální, protože tím nezískávám seznam polí se stringy...

Kód: Delphi [Vybrat]
  1. remapTab := TStringList.create;
  2. remapTab.LoadFromFile('b:\remap-tab.txt');
  3.  

Co bych měl použít, aby se v tom seznamu dal snadno vyhledat překlad názvu?
Název: Re:Jak na vyhledávání stringů?
Přispěvatel: vangog 20-09-2018, 23:18:46
Mohl bys prosímtě napsal příklad na ten DelimiterText? Nikde nemohu najít příklad.
Název: Re:Jak na vyhledávání stringů?
Přispěvatel: martinnr 21-09-2018, 07:44:18
podla pouzitej verzie Delphi mozes pracovat s triedou TList<string>, so vsetkymi jej funkciami, ktore su o nieco lepsie ako v TStrilgList.
Název: Re:Jak na vyhledávání stringů?
Přispěvatel: martinnr 21-09-2018, 08:13:01
mozno aj TDictionary, ale nechapem celkom zadanie, ci tam ma zoznam dvoch stringov pre kazdy "zaznam", alebo je to len zoznam jedno-stringov a ten preklad az nasledne...
TList v D7 sa da pouzit.
Název: Re:Jak na vyhledávání stringů?
Přispěvatel: vangog 21-09-2018, 09:54:14
Tedy jak jsem to pochopil, jde o kolekci klicu (napr. 1 Chronicles) a hodnot (napr. 1_chronicles) oddelenych strednikem s tim ze ma byt moznost hledat klic a modifikovat hodnotu (jazykovym prekladem).

Ano.
Ano, verze Delphi 7.
Název: Re:Jak na vyhledávání stringů?
Přispěvatel: vangog 21-09-2018, 10:09:19
Jak by to teda mělo vypadat?

Kód: Delphi [Vybrat]
  1. remapTab: array[0..1] of TList;
  2. begin
  3.   SourceList.LoadFromFile('b:\remap-tab.txt');
  4.   for i:=0 to SourceList.count-1 do
  5.     begin
  6.       // TList.create; ?
  7.       remapTab.add();
  8.     end;
  9. end;
  10.  

Mám založit array of TList?
Nebo spíš tak nějak
remapTab: TList of array[0..1] of String;
ani nevím jak to nadklarovat.
Název: Re:Jak na vyhledávání stringů?
Přispěvatel: martinnr 21-09-2018, 10:54:57
aha, necitam poriadne. sory.
no to D7 to komplikuje. TList v tomto pripade nepomoze moc a TDictionary nemas.

tak to cez StringList rozbit, vytvorit si druhy StringList, kde budu len orig nazvy pre vyhladavanie a preklad potom z povodneho zoznamu. nejak takto:

Kód: Delphi [Vybrat]
  1. findingList: TStringList;
  2. ...
  3. begin
  4.   SourceList.LoadFromFile('b:\remap-tab.txt');
  5.   for i:=0 to SourceList.count-1 do
  6.     begin
  7.       findingList.add(copy(SourceList[i], 1, pos(';', SourceList[i] - 1)));
  8.     end;
  9. end;
  10.  
  11. function najdi_preklad(co : string) : string;
  12. var
  13.   pos : integer;
  14. begin
  15.   pos := findingList.IndexOf(co);
  16.   Result := copy(SourceList[pos], pos(';', SourceList[pos] + 1), 1000);
  17. end;
  18.  

samozrejme podmienkou je, aby vyhladavny retazec bol v zozname, resp. aby tam vzdy bol aj preklad, aby bola vzdy pouzita ";" na oddelenie, atd. alebo osetrit pripadne mozne chyby.
Název: Re:Jak na vyhledávání stringů?
Přispěvatel: vangog 21-09-2018, 11:28:58
Co si myslel tím

Kód: Delphi [Vybrat]
  1. SourceList[i] - 1
Nejde ze stringu odečíst číslo.

Myslel si

Kód: Delphi [Vybrat]
  1. SourceList[i- 1]
?
nebo
Kód: Delphi [Vybrat]
  1. pos(';', SourceList[i] )-1));
?

u toho druhého pos taky
Název: Re:Jak na vyhledávání stringů?
Přispěvatel: martinnr 21-09-2018, 12:07:47
zle su zatvorky, pisal som to priamo tu, nie v delphi, takze:
Kód: Delphi [Vybrat]
  1. copy(SourceList[i], 1, pos(';', SourceList[i]) - 1)
a
Kód: Delphi [Vybrat]
  1. copy(SourceList[pos], pos(';', SourceList[pos])+ 1, 1000)
Název: Re:Jak na vyhledávání stringů?
Přispěvatel: JaroB 21-09-2018, 12:12:10
Nebylo by jednodušší to jako text-csv načíst do nějakého CSV ready datasetu?
Název: Re:Jak na vyhledávání stringů?
Přispěvatel: vangog 21-09-2018, 12:27:58
zle su zatvorky, pisal som to priamo tu, nie v delphi, takze:

Díky už jsem to opravil a rozjel:

Kód: Delphi [Vybrat]
  1.  
  2. booknames, remapList: TStringList;
  3. begin
  4.   booknames := TStringList.create;
  5.   remapList := TStringList.create;
  6.   remapList.LoadFromFile('b:\remap-tab.txt');
  7.   // do booknames dát jen skutečné názvy knih
  8.   for i:=0 to remapList.count-1 do
  9.       booknames.add(copy(remapList[i], 1, pos(';', remapList[i])-1) );
  10.  
  11.   // následující kód může být zanořený ve smyčce, nebo volaný pomocí funkce
  12.   // EXTRAHOVAT 'nazev' ze seznamu Názvů knih
  13.   foundPos := booknames.IndexOf(book_name);
  14.   book := copy(remapList[foundPos], pos(';', remapList[foundPos])+1, 1000);  
  15. end;
  16.