1. Wyrażenia regularne
Opis ogólny
Wyszukiwanie ciągów znaków wg wzorca (szablonu)
Sprawdzanie poprawności ciągów znaków
2. W programie Trawers
Sprawdzanie poprawności symboli
Warunki Query
Szukanie w plikach tekstowych
Szukanie w treści e-maili
Formatowanie wydruków
Szukanie w pliku CSV z wyciągiem bankowym
3. Tematy powiązane
4. Aneks. Plik CSV w formacie iPKO Biznes Elixir
1. Wyrażenia regularne
RegEx, regex (en: regular expression) to szablon, który opisuje ciąg znaków.
Wyrażenia regularne stosowane są do sprawdzania poprawności ciągów znaków
oraz wyszukiwania w tekstach wystąpień wzorca, np.
Wyszukiwanie ciągów znaków wg wzorca (szablonu)
wyrażenie rezultat wyszukania
-----------------------------------------------------
a.a ---> adaptacja wymiana zapasami
cen. ---> cena ceny licencja ujednolicenie
t{2} ---> motto Scott
(Re:.){2} ---> Re: Re:
Etap [0-9] ---> Etap 1 Etap 2 Etap 132
-----------------------------------------------------
Sprawdzanie poprawności ciągów znaków
* Wyrażenie: ^\d{6}\s{19}
Ciąg znaków, np. numer produktu powinien składać się z 6 cyfr i 19 spacji.
* Wyrażenie: [0-9]{2}-[0-9]{3}
Kod pocztowy, np. 84-230
* Wyrażenie: ^([01]\d|2[0-3]):([0-5]\d)$
Czas w formacie HH:MM, ograniczony do zakresu od 00:00 do 23:59
* Wyrażenie: [0-9]{2}X[0-9]{4}X[0-9]{4}X\sH[0-9]{2}
Indeks wyrobu z zapisanym wymiarem w milimetrach.
Oznaczenia stosowane w branży hutniczej, np. oznaczenia arkuszy blach, prętów.
Oznaczenia płyt meblowych, kabli o różnych długościach, bębnów o różnych rozmiarach.
Np. 10X1000X6000 H01. Pierwszy wymiar to grubość, drugi to szerokość,
trzeci to długość, H01 to typ.
Można dopuścić wiele oznaczeń literowych typów (wymienić w nawiasach
kwadratowych), np. D,H,S.
Wyrażenie: [0-9]{2}X[0-9]{4}X[0-9]{4}X\s[DHS][0-9]{2}
Gdy pierwszym znakiem jest ^, to wprowadzany ciąg nie może
zawierać spacji na początku. Np. ^\d{6}\s{19}
Stosuje się, gdy numeracja powinna być:
000001, 000002, ... 000101, ... 001001, ... itd.
a nie: 1, 2, 3, ... 100, 102, ..., 1001
2. W programie Trawers
W programie Trawers, wyrażenia regularne można stosować:
Sprawdzanie poprawności symboli
* Sprawdzanie poprawności (walidacji) rejestrowanych symboli.
Np. numerów serwisowanych produktów:
W parametrach SE Serwisowanie produktów podaje się:
Szablon numeracji produktu. Wg RegEx [.....] (pole: ValidNr)
Gdy numer produktu powinien składać się z 6 cyfr i 19 spacji,
to wyrażenie regularne ma postać: ^\d{6}\s{19}
Szablon: 6 cyfr + opcjonalnie znak ABCDEFGHI, spacja + 18 spacji
można zapisać jako wyrażenie: ^\d{6}[ABCDEFGHI\s]\s{18}
Szablon wykorzystywany jest podczas dopisywania serwisowanych produktów.
Aby numer produktu wpisywany przez użytkownika był zgodny ze szablonem
określonym podczas wdrożenia systemu.
System informuje, gdy wpisany numer jest nieprawidłowy.
Patrz opis parametrów SE:
Parametry SE Serwisowanie produktów
* Przeszukiwanie plików tekstowych, np. plików wydrukowych
Szukanie w bazie danych
Np. przeszukiwanie plików tekstowych
o---------------------------o
| | [N] Traktuj szukany tekst wprost
| Regularne ? : T <-------- [T] Traktuj szukany tekst jako wyrażenie regularne
| |
| Szukaj : cen. <-------- Szukany tekst
| |
o---------------------------o
* Formatowanie wydruków
Funkcje stosujące wyrażenia regularne:
ţRegex{} Zwraca fragment tekstu odpowiadający wyrażeniu regularnemu
ţDoRegex{} Przekształca tekst na wyrażenie regularne
ţIleReg{} Zwraca liczbę ciągów zgodnych z wyrażeniem regularnym
Patrz szczegóły:
Funkcje TrExtLang
Szukanie w pliku CSV z wyciągiem bankowym
Plik CSV z wyciągiem bankowym może zawierać szczegóły, które identyfikują
charakter operacji bankowej: wpłata/wypłata, kontrahent,
nr dokumentu (faktury), kwota.
Te szczegóły mogą być podane w sposób uporządkowany (strukturalny) i zawierają
oznaczenia (kody) wskazujące na rodzaj danych.
W takim przypadku można zbudować definicję struktury pliku CSV i wskazać
miejsca tych danych (wpłata/wypłata, kontrahent, itd.)
Do wskazania miejsc stosuje się wyrażenia regularne (regex).
Poniżej podano przykład wykorzystania wyrażeń regularnych (regex)
do interpretacji zapisów w CSV.
Przykład dotyczy wyciągu bankowego pobranego w formacie iPKO Biznes Elixir.
Gdy pobiera się wyciąg z przelewem: Split payment MPP.
W wyciągu bankowym, w pliku CSV, można wyszukać treści przelewu:
* nr NIP kontrahenta
* numer faktury
* kwota VAT
Przykładowa struktura pliku CSV wyciągu wg formatu iPKO Biznes Elixir.
----------------------------------------------------------------------- AD5 (ad_ttx50) --
Sys ------------- Tabela -------------
---------- Definicja ------------ OSKN -- Data -- PL Plik
-----------------------------------------------------------------------------------------
KB 001 Wyciągi bankowe
AA aa ",,N RRRRMMDD WIN wyciag.csv
Typ komunikatu 111(uzn) 222(ob 1 C 3 TYPKOM
Data 2 D DATA
Kwota 3 N 9 0 KWOTA 0.01000000
Treść 1 12 C 35 TRESC1
NIP 12 C 13 NIP
Nr faktury 12 C 64 NRFAKTUR
Szukaj wg regex: \/INV\/(.*)\/TXT\/
Kwota VAT 12 N 9 2 KWOTAVAT 1.00000000
Szukaj wg regex: \/VAT\/([^\/]*)\/
Nr rachunku kontrahenta 6 C 43 RACHKONT
Przykład pliku:
111,20231129,12300,"","","123...","TESTPOL SA ","","","","","/VAT/23,00/IDC/1234567890/INV/FV0002/11/23/TXT/DOWOLNY TEKST"
111,20231129,24600,"","","123...","TESTPOL SA ","","","","","/VAT/46,00/IDC/1234567890/INV/FV0003/11/23/TXT/DOWOLNY TEKST"
Patrz dalej szczegółowy opis interpretacji przelewu CSV Split Payment,
w formacie iPKO Biznes Elixir (patrz: Aneks)
Opis importowania wyciągu bankowego z pliku CSV oraz sposobu interpretacji danych
przelewu Split Payment w formacie iPKO Biznes Elixir.
1. Dane w pliku CSV
Przykładowy wiersz:
```
111,20231129,12300,"","","123...","TESTPOL SA ","","","","","/VAT/23,00/IDC/1234567890/INV/FV0002/11/23/TXT/DOWOLNY TEKST"
```
Najważniejsze pola to:
| Pozycja | Wartość | Znaczenie |
| ------: | -------------------- | ------------------------------------ |
| 1 | `111` | typ komunikatu, np. uznanie rachunku |
| 2 | `20231129` | data operacji: 29.11.2023 |
| 3 | `12300` | kwota operacji |
| 12 | `/VAT/23,00/IDC/...` | pełna treść przelewu |
W definicji:
```
Typ komunikatu 1 C 3 TYPKOM
Data 2 D DATA
Kwota 3 N 9 0 KWOTA 0.01000000
Treść 1 12 C 35 TRESC1
```
liczby `1`, `2`, `3`, `12` wskazują numer kolumny w pliku CSV.
Litery oznaczają typ danych:
* `C` - tekst,
* `D` - data,
* `N` - liczba.
Przelicznik:
```
0.01000000
```
oznacza, że wartość z pliku jest mnożona przez `0,01`. Czyli:
```
12300 × 0,01 = 123,00
24600 × 0,01 = 246,00
```
2. Struktura opisu przelewu MPP
Treść przelewu:
```
/VAT/23,00/IDC/1234567890/INV/FV0002/11/23/TXT/DOWOLNY TEKST
```
jest podzielona znacznikami:
```
/VAT/kwota VAT
/IDC/NIP kontrahenta
/INV/numer faktury
/TXT/dodatkowy opis
```
W tym przykładzie:
* kwota VAT: `23,00`,
* NIP: `1234567890`,
* numer faktury: `FV0002/11/23`,
* tekst dodatkowy: `DOWOLNY TEKST`.
Trawers pobiera te dane z kolumny 12, używając wyrażeń regularnych.
3. Pobranie NIP-u
```regex
\/IDC\/([^\/]*)\/
```
Elementy wyrażenia:
* `\/IDC\/` - wyszukaj dosłowny fragment `/IDC/`,
* `(` i `)` - wyznaczają część, która ma zostać pobrana,
* `[^\/]*` - pobieraj dowolne znaki z wyjątkiem `/`,
* końcowe `\/` - zakończ pobieranie na następnym ukośniku.
Dla tekstu:
```
/IDC/1234567890/INV/
```
wynikiem grupy w nawiasach będzie:
```
1234567890
```
Czyli do pola `NIP` zostanie wpisany numer:
```
1234567890
```
4. Pobranie numeru faktury
```regex
\/INV\/(.*)\/TXT\/
```
Znaczenie:
* `\/INV\/` - znajdź początek numeru faktury,
* `(.*)` - pobierz dowolną liczbę dowolnych znaków,
* `\/TXT\/` - zakończ na znaczniku `/TXT/`.
Dla fragmentu:
```
/INV/FV0002/11/23/TXT/
```
zostanie pobrane:
```
FV0002/11/23
```
Tutaj zastosowano `.*`, ponieważ numer faktury może zawierać ukośniki. Nie można więc
użyć takiego samego wyrażenia jak dla NIP-u.
`.*` jest wyrażeniem zachłannym. Jeżeli w opisie wystąpiłby więcej niż jeden fragment `/TXT/`,
może ono pobrać tekst aż do ostatniego wystąpienia `/TXT/`.
Gdy silnik regex Trawersa obsługuje zapis niezachłanny, bezpieczniejszym wariantem byłoby:
```regex
\/INV\/(.*?)\/TXT\/
```
W typowym komunikacie MPP podany zapis powinien jednak działać prawidłowo.
5. Pobranie kwoty VAT
```regex
\/VAT\/([^\/]*)\/
```
Działa analogicznie jak wyrażenie dla NIP-u:
* znajduje `/VAT/`,
* pobiera wszystko do następnego `/`.
Dla:
```
/VAT/23,00/IDC/
```
zostanie pobrane:
```
23,00
```
Ponieważ pole docelowe ma typ liczbowy:
```
Kwota VAT 12 N 9 2 KWOTAVAT 1.00000000
```
Trawers interpretuje wynik jako liczbę z dwoma miejscami po przecinku.
Przelicznik `1.00000000` oznacza, że kwota nie jest dodatkowo przeliczana:
```
23,00 × 1 = 23,00
```
6. Wynik dla podanych wierszy
Dla pierwszego wiersza:
```
111,20231129,12300,...,"/VAT/23,00/IDC/1234567890/INV/FV0002/11/23/TXT/DOWOLNY TEKST"
```
Trawers powinien odczytać:
| Pole | Wynik |
| -------------- | -------------- |
| Typ komunikatu | `111` |
| Data | `29.11.2023` |
| Kwota | `123,00` |
| NIP | `1234567890` |
| Nr faktury | `FV0002/11/23` |
| Kwota VAT | `23,00` |
Dla drugiego:
```
111,20231129,24600,...,"/VAT/46,00/IDC/1234567890/INV/FV0003/11/23/TXT/DOWOLNY TEKST"
```
| Pole | Wynik |
| -------------- | -------------- |
| Typ komunikatu | `111` |
| Data | `29.11.2023` |
| Kwota | `246,00` |
| NIP | `1234567890` |
| Nr faktury | `FV0003/11/23` |
| Kwota VAT | `46,00` |
Najważniejsza zasada jest taka: wszystkie trzy wartości - NIP, numer faktury i VAT -
fizycznie znajdują się w kolumnie 12 CSV, a regex wskazuje, który fragment tej kolumny
ma trafić do konkretnego pola Trawersa.