Autor Téma: Jak na vyhledávání stringů?  (Přečteno 726 krát)

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Jak na vyhledávání stringů?
« kdy: 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?

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Jak na vyhledávání stringů?
« Odpověď #1 kdy: 20-09-2018, 23:12:16 »
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?

Strring list se pouzit da. Pres DelimitedText nakrmis kolekci (s Delimiter nastavenym na strednik) a prekladas prepisem Values.
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:Jak na vyhledávání stringů?
« Odpověď #2 kdy: 20-09-2018, 23:18:46 »
Mohl bys prosímtě napsal příklad na ten DelimiterText? Nikde nemohu najít příklad.

Offline martinnr

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: 7,2009,XE7
Re:Jak na vyhledávání stringů?
« Odpověď #3 kdy: 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.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Jak na vyhledávání stringů?
« Odpověď #4 kdy: 21-09-2018, 07:59:01 »
podla pouzitej verzie Delphi mozes pracovat s triedou TList<string>, so vsetkymi jej funkciami, ktore su o nieco lepsie ako v TStrilgList.

Spis TDictionary<string, string>, ale OP ma Delphi 7.
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline martinnr

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: 7,2009,XE7
Re:Jak na vyhledávání stringů?
« Odpověď #5 kdy: 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.

Offline Delfin

  • Padawan
  • ******
  • Příspěvků: 1823
  • Karma: 70
  • SW konzultant
    • Verze Delphi: 2009, Tokyo, Rio
Re:Jak na vyhledávání stringů?
« Odpověď #6 kdy: 21-09-2018, 08:47:20 »
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.

Pise:

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

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).
I'm a soldier, so don't panic! I know the underground! I like the WTFPL license! No more Google, go duck, go!

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:Jak na vyhledávání stringů?
« Odpověď #7 kdy: 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.
« Poslední změna: 21-09-2018, 09:58:35 od vangog »

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:Jak na vyhledávání stringů?
« Odpověď #8 kdy: 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.

Offline martinnr

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: 7,2009,XE7
Re:Jak na vyhledávání stringů?
« Odpověď #9 kdy: 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.

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:Jak na vyhledávání stringů?
« Odpověď #10 kdy: 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
« Poslední změna: 21-09-2018, 11:39:50 od vangog »

Offline martinnr

  • Plnoletý
  • ***
  • Příspěvků: 168
  • Karma: 2
    • Verze Delphi: 7,2009,XE7
Re:Jak na vyhledávání stringů?
« Odpověď #11 kdy: 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)

Online JaroB

  • Guru
  • *****
  • Příspěvků: 948
  • Karma: 26
    • Verze Delphi: XE8, Seattle
Re:Jak na vyhledávání stringů?
« Odpověď #12 kdy: 21-09-2018, 12:12:10 »
Nebylo by jednodušší to jako text-csv načíst do nějakého CSV ready datasetu?

Offline vangog

  • Hrdina
  • ****
  • Příspěvků: 370
  • Karma: 0
    • Verze Delphi: 7
Re:Jak na vyhledávání stringů?
« Odpověď #13 kdy: 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.  

« Poslední změna: 21-09-2018, 12:32:28 od vangog »