Różnice między wybraną wersją a wersją aktualną.
Both sides previous revision Previous revision Next revision | Previous revision | ||
tokenizer [2008/04/12 21:24] mplacht1 |
tokenizer [2008/04/14 08:45] (aktualna) mplacht1 |
||
---|---|---|---|
Linia 27: | Linia 27: | ||
using namespace boost; | using namespace boost; | ||
- | string str = "To jest, prosty przyklad"; | + | string str = "To jest, przyklad"; |
int main(){ | int main(){ | ||
Linia 45: | Linia 45: | ||
To | To | ||
jest | jest | ||
- | prosty | ||
przyklad | przyklad | ||
</code> | </code> | ||
Linia 99: | Linia 98: | ||
* Type - typ sekwencji\\ | * Type - typ sekwencji\\ | ||
\\ | \\ | ||
- | W celu utorzenia iteratora musimy podać iterator wskazujący na początek dzielonej sekwencji ''begin'', interator wskazujący dokładnie za dzieloną sekwencję ''end'' oraz funkcję podziału sekwencji ''fun''. | + | W celu utorzenia iteratora musimy podać iterator wskazujący na początek dzielonej sekwencji ''begin'', iterator wskazujący dokładnie za dzieloną sekwencję ''end'' oraz funkcję podziału sekwencji ''fun''. |
<code cpp> | <code cpp> | ||
template<class Type, class Iterator, class TokenizerFunc> | template<class Type, class Iterator, class TokenizerFunc> | ||
Linia 106: | Linia 105: | ||
</code> | </code> | ||
\\ | \\ | ||
- | Przykład użycia orzy wykorzystaniu funktora ''offset_separator'' dzielącego łańcuch znakowy na podciągi o określonej długości. | + | Przykład użycia przy wykorzystaniu funktora ''offset_separator'' (opisanego dalej) dzielącego łańcuch znakowy na podciągi o określonej długości. |
<code cpp> | <code cpp> | ||
#include<iostream> | #include<iostream> | ||
Linia 114: | Linia 113: | ||
using namespace std; | using namespace std; | ||
using namespace boost; | using namespace boost; | ||
+ | |||
+ | string s = "12252001"; | ||
+ | int offsets[] = {2,2,4}; | ||
int main(){ | int main(){ | ||
- | string s = "12252001"; | ||
- | int offsets[] = {2,2,4}; | ||
offset_separator f(offsets, offsets+3); | offset_separator f(offsets, offsets+3); | ||
typedef token_iterator_generator<offset_separator>::type Iter; | typedef token_iterator_generator<offset_separator>::type Iter; | ||
Linia 141: | Linia 141: | ||
\\ | \\ | ||
Funkcja ''strtok()'' po dokonaniu podziału sekwencji nie umieszcza znaków rodzielających poszczególne podciągi. Jednak czasami okazuje się przydatnym posiadanie znaków rozdzielających pojawiających się w wyjściowej sekwencji podciągów, dlatego ''char_separator'' zapewnia takie rozwiązanie.\\ | Funkcja ''strtok()'' po dokonaniu podziału sekwencji nie umieszcza znaków rodzielających poszczególne podciągi. Jednak czasami okazuje się przydatnym posiadanie znaków rozdzielających pojawiających się w wyjściowej sekwencji podciągów, dlatego ''char_separator'' zapewnia takie rozwiązanie.\\ | ||
- | Kiedy swa znaki rozdzielające znajdują sie w sekwencji jeden za drugim. funkcja ''strtok()'' pomija je, natomiast ''char_separator'' pozwala również w takiej sytuacji na utworzenie pustego podciągu, w zależności od wyboru.\\ | + | Kiedy dwa znaki rozdzielające znajdują sie w sekwencji jeden za drugim. funkcja ''strtok()'' pomija je, natomiast ''char_separator'' pozwala również w takiej sytuacji na utworzenie pustego podciągu, w zależności od wyboru.\\ |
\\ | \\ | ||
Poniższy przykład pokazuje jak zastąpić funkcję ''strtok()'' za pomocą ''char_separator''. Określone są trzy znaki rozdzielające, które nie pojawią się w wyjściowych podciągach, puste podciągi będą ignorowane. | Poniższy przykład pokazuje jak zastąpić funkcję ''strtok()'' za pomocą ''char_separator''. Określone są trzy znaki rozdzielające, które nie pojawią się w wyjściowych podciągach, puste podciągi będą ignorowane. | ||
Linia 200: | Linia 200: | ||
---- | ---- | ||
==== Klasa escaped_list_separator ==== | ==== Klasa escaped_list_separator ==== | ||
+ | Klasa ''escaped_list_separator'' jest jedną z implementacji funktora TokenizerFunction. ''escaped_list_separator'' formatuje dane typu ''csv'' (''Comma Separated Values'' - wartości rozdzielone przecinkiem). Poniższy przykład obrazuje format, w którym użyto domyślnych znaków separatora, cytowania oraz znaku przywracającego znaczenie. | ||
+ | ''Pole 1,Pole 2,Pole 3''\\ | ||
+ | ''Pole 1,"Pole2, z przecinkiem",Pole3''\\ | ||
+ | ''Pole1,Pole2 z\"otoczony cytowaniem\",Pole3''\\ | ||
+ | ''Pole1, Pole2 z \n nowa linią,Pole3''\\ | ||
+ | ''Pole1, Pole2 z otoczonym \\,Pole3''\\ | ||
+ | |||
+ | Pola są domyślnie oddzielane przez przecinki. W celu wstawienia przecinka do pola, należy otoczyć go cytowaniem. Sekwencje trzech znaków przywracających znaczenie są wspierane. | ||
+ | \\ | ||
+ | Przykład użycia: | ||
+ | <code cpp> | ||
+ | #include<iostream> | ||
+ | #include<boost/tokenizer.hpp> | ||
+ | #include<string> | ||
+ | |||
+ | using namespace std; | ||
+ | using namespace boost; | ||
+ | |||
+ | string s = "Pole1,\"wstawianie cytowania dookola pola umozliwia, uzywanie przecinkow\",Pole3"; | ||
+ | |||
+ | int main(){ | ||
+ | tokenizer<escaped_list_separator<char> > tok(s); | ||
+ | for(tokenizer<escaped_list_separator<char> >::iterator beg=tok.begin(); beg!=tok.end();++beg){ | ||
+ | cout << *beg << "\n"; | ||
+ | } | ||
+ | return 0; | ||
+ | } | ||
+ | </code> | ||
+ | Wynikiem działania programu będzie sekwencja: | ||
+ | <code> | ||
+ | Pole1 | ||
+ | wstawianie cytowania dookola pola umozliwia, uzywanie przecinkow | ||
+ | Pole3 | ||
+ | </code> | ||
+ | \\ | ||
+ | Klasa ''escaped_list_separator'' posiada dwa następujące konstruktory: | ||
+ | <code cpp> | ||
+ | explicit escaped_list_separator(Char e = '\\', Char c = ',',Char q = '\"') | ||
+ | </code> | ||
+ | Parametry konstruktora: | ||
+ | * e - określa znak, który przywraca pierwotne znaczenie znaku następującego po nim | ||
+ | * c - określa znak używany jako separator | ||
+ | * q - określa znak oznaczający cytowanie | ||
+ | \\ | ||
+ | <code cpp> | ||
+ | escaped_list_separator(string_type e, string_type c, string_type q): | ||
+ | </code> | ||
+ | Parametry konstruktora: | ||
+ | * e - znaki z łańcucha określaja znaki, które przywracają pierwotne znaczenie znaku następującego po nim, pusty łańcuch określa brak takiego znaku | ||
+ | * c - każdy znak z łańcucha określa znak używany jako separator, pusty łańcuch określa brak takiego znaku | ||
+ | * q - znaki z łańcucha określaja znak oznaczający cytowanie, pusty łańcuch określa brak takiego znaku | ||
+ | \\ | ||
---- | ---- | ||
==== Klasa offset_separator ==== | ==== Klasa offset_separator ==== | ||
- | Klasa ''offset_separator'' jest jedną z implementacji funktora TokenizerFunction, która może być użyta w celu podziału sekwencji na podciągi. ''offset_separator'' dzieli sekwencję znaków ''char'' na łańcuchy znakowe o określonej długości bazując na zdefiniowanych przesunięciach.\\ | + | Klasa ''offset_separator'' jest kolejną z implementacji funktora TokenizerFunction, która może być użyta w celu podziału sekwencji na podciągi. ''offset_separator'' dzieli sekwencję znaków ''char'' na łańcuchy znakowe o określonej długości bazując na zdefiniowanych przesunięciach.\\ |
Poniższy przykład dzieli sekwencję "12252001" przy użyciu przesunięc(2,2,4) na podciągi 12 25 2001: | Poniższy przykład dzieli sekwencję "12252001" przy użyciu przesunięc(2,2,4) na podciągi 12 25 2001: | ||
<code cpp> | <code cpp> |