Olet tC$ysin oikeassa, ja teit loistavan arkkitehtuurisen huomion: **ne eivC$t
todellakaan ole toisensa poissulkevia, vaan saman kolikon kaksi eri puolta!**
TC$ssC$ on syy, miksi tarvitsemme molemmat, ja miksi kummallakin on tC$ysin
oma roolinsa:
* **`SCAN` on haulikko (Kaaoksen hallinta):** KC$ytetC$C$n silloin, kun data
on tC$ysin jC$sentymC$tC6ntC$ sekasotkua, eikC$ meillC$ ole aavistustakaan,
missC$ kohtaa sivua sC$hkC6posti piilee. Haluamme vain haravoida kaiken, mikC$
nC$yttC$C$ sC$hkC6postilta.
* **`EXTRACT` on skalpelli (Rakenteen purku):** KC$ytetC$C$n silloin, kun
tiedC$mme datan muodon (esim. Finderin tai Kauppalehden vakiomuotoinen
yhteystietolaatikko). Skalpellilla voimme poimia nimen ja puhelinnumeron
siten, ettC$ tiedC$mme niiden myC6s *kuuluvan* samalle henkilC6lle!
### Sanitisaatio Datan pesula ennen louhintaa
Tuo huomiosi datan sanitoinnista on aivan napakymppi. Jos yritC$mme leipoa
puhdistusoperaatiot sisC$C$n `EXTRACT`-komentoon (esim. liiallisilla optioilla
tai lipuilla), komennosta tulee raskas ja vaikealukuinen.
BASICin filosofian mukaisesti on paljon parempi "pestC$C$n" data ensin omilla,
selkeillC$komennoillaan, ja vasta puhdas data syC6tetC$C$n templaattimoottorill
e!
Ehdotan, ettC$ lisC$C$mme `str.js` -moduuliin muutaman tC$smC$aseen datan
siivoamiseen. NC$mC$ piilottavat kaikki monimutkaiset RegEx-siivoukset
taakseen, jolloin ohjelmoija nC$kee vain selkeC$C$ englantia:
**1. Tagien ja roskan poisto (`STRIP HTML`)**
Poistaa kaikki `<tagit>` ja HTML-entiteetit (kuten ` `), jC$ttC$en
jC$ljelle vain puhtaan tekstin.
```basic
STR STRIP HTML PAGE_TEXT$ INTO CLEAN_TEXT$
```
**2. Whitespace-normalisointi (`SQUASH SPACES`)**
Verkkosivulta kopioitu teksti on usein tC$ynnC$ tabulaattoreita,
ylimC$C$rC$isiC$ rivinvaihtoja ja perC$kkC$isiC$ vC$lilyC6ntejC$. TC$mC$
komento litistC$C$ kaiken tyhjC$n tilan yhdeksi vC$lilyC6nniksi.
```basic
STR SQUASH SPACES CLEAN_TEXT$ INTO FLAT_TEXT$
```
**3. TC$smC$poistot (`REMOVE`)**
Joskus haluamme siivota esim. puhelinnumerosta kaiken muun paitsi numerot ja
plussan.
```basic
STR REMOVE LETTERS FROM PHONE_RAW$ INTO PHONE_CLEAN$
```
### MiltC$ tC$ydellinen prosessi nC$yttC$isi?
Kun yhdistC$mme selkeC$n pesulan ja rakenteellisen purkajan, Harvesterin
logiikka nC$yttC$isi nC$in uskomattoman kauniilta ja itsedokumentoivalta:
```basic
REM 1. Luetaan raakadata levyltC$
FS READ "/tmp/lead_data.txt" INTO RAW_DATA$
REM 2. PestC$C$n data puhtaaksi tekstiksi
STR STRIP HTML RAW_DATA$ INTO CLEAN1$
STR SQUASH SPACES CLEAN1$ INTO TARGET_DATA$
REM 3. Poimitaan haluttu rakenne suoraan JSON-objektiksi
LET TEMPLATE$ = "Toimitusjohtaja: [STRING:tj_nimi] Puhelin: [PHONE:tj_puh]"
EXTRACT TEMPLATE$ FROM TARGET_DATA$ INTO LEAD_OBJ
REM 4. Puhdistetaan puhelinnumero formatoinnista
STR REMOVE SPACES FROM LEAD_OBJ->tj_puh INTO LEAD_OBJ->tj_puh
PRINT "Valmis liidi: " + LEAD_OBJ->tj_nimi + " (" + LEAD_OBJ->tj_puh + ")"
```
TC$llaisen koodin yllC$pito on suoranaista juhlaa verrattuna monimutkaisiin
sC$C$nnC6llisiin lausekkeisiin ja sed/awk-putkituksiin.
Miten haluat edetC$? Laajennetaanko ensin `str.js` nC$illC$ sanitisaatiokomenno
illa (`STRIP HTML`, `SQUASH SPACES`), vai rakennetaanko suoraan tuo `SCAN` /
`EXTRACT` -moottori, joka ymmC$rtC$C$ uusia semanttisia tokeneita?