SQL Tips: Split

SQL-kyselyissä tulee ajoittain tarvetta pilkkoa jonkin kentän sisältöä palasiksi. SQL Serverin versiosta 2016 alkaen T-SQL tarjoaa sisäisen funktion pilkkomisen tekemiseen. Lisäksi kannan compatibility level -asetus pitää olla vähintään 130, jotta tuo sisäinen string_split -funktio löytyy ja on käytettävissä.

String_split -funktion käyttö on hyvin suoraviivaista; parametreiksi annetaan pilkottava merkkijono sekä erotinmerkki. Funktio palauttaa yksisarakkeisen taulun, jossa pilkotut merkkijonon alkiot ovat value -nimisessä kentässä.

Helppo käyttöesimerkki on datan suodattaminen. Alla olevassa kyselyssä on Customer -taulusta suodatettu mukaan ne rivit, joiden id -kentän arvo on @test -merkkijonon sisällä.

Entäpä sitten aikaisemmissa Sql Serverin versioissa, joissa sisäistä funktiota ei ole tarjolla? Ainut tapa saada vastaava toiminnallisuus on tehdä oma funktio. Alla on esimerkkitoteutus funktiosta. Mukana on myös muutama lisäominaisuus; OrderNbr ja Trim.

Oman funktion käyttö on hyvin samanlaista kuin sisäisen string_split -funktion käyttö. Alla vastaava haku kuin ensimmäisessä esimerkissä.

Tässä esimerkissä on otettu mukaan myös oman funktion tarjoama OrderNbr -kenttä, josta nähdään monesko alkio on kyseessä.

Tekoäly vedenkulutuksen jäljillä

Optical character recognition (tekstintunnistus) on jo vanha tekniikka, mutta uusia käyttökohteita sille keksitään varmasti jatkuvalla syötöllä. Kaikille lienee tuttu aihe esimerkiksi ajoneuvon rekisterikilven koneellinen lukeminen tai postin lajittelu koneellisesti. Molemmissa tapauksissa syötteestä tunnistetaan automaattisesti tekstiä.

Periaatehan OCR:ssä on hyvin yksinkertainen; se on joko mekaaninen tai sähköinen prosessi, jossa pyritään tunnistamaan tekstiä ja saattamaan se käyttäjälle helpompaan muotoon. Normaalisti se helpompi muoto on digitaalinen muoto, mutta aikanaan on käytetty myös esim. äänimerkkejä (savumerkeistä en tiedä).

Omat OCR-kokeiluni olen aloittanut noin kymmenisen vuotta sitten. Tein silloin kotiautomaatioprojektia, jossa halusin myös vesimittarin lukeman digitaaliseen muotoon – ja mieluiten reaaliajassa. Tuossa tapauksessa en käyttänyt mitään valmiita kirjastoja, vaan “opetin” koodini tunnistamaan vesimittarissa käytettävät numerot. Siihen aikaan se oli vielä mekaaninen rullamittari. Hieman nihkeää pikselitason koodailua, mutta toimiva tuli. Ja reaaliajassa lukemat sai kiinni, kun webbikamera oli asennettuna vesimittarin päälle ja kameran livekuvasta tehtiin frame kerrallaan tunnistusta.

Nykypäivänä voidaan helposti tehdä tekstintunnistussovelluksia, joissa käytetään valmiina olevia OCR-tekoälykirjastoja. Nämä kirjastot ovat opetettu tunnistamaan erilaista tekstiä ja tukemaan eri kieliä. Samoissa kirjastoissa saattaa olla tuki myös muulle kuin OCR:lle, vaikkapa hahmontunnistus. Osa kirjastoista on myös sellaisia, että niitä voidaan jatko-opettaa. Esimerkiksi puuttuva kielituki saadaan, kun opetetaan uusi kieli itse. Näiden kirjastojen käytöllä oman koodin tuottamisen tarve on vähäinen ja (tekoäly)projektien aloituskynnys on matalalla.

Vesimittarin luenta tekoälyvälineillä

Optical character recognition (tekstintunnistus) on jo vanha tekniikka, mutta uusia käyttökohteita sille keksitään varmasti jatkuvalla syötöllä. Kaikille lienee tuttu aihe esimerkiksi ajoneuvon rekisterikilven koneellinen lukeminen tai postin lajittelu koneellisesti. Molemmissa tapauksissa syötteestä tunnistetaan automaattisesti tekstiä.

Periaatehan OCR:ssä on hyvin yksinkertainen; se on joko mekaaninen tai sähköinen prosessi, jossa pyritään tunnistamaan tekstiä ja saattamaan se käyttäjälle helpompaan muotoon. Normaalisti se helpompi muoto on digitaalinen muoto, mutta aikanaan on käytetty myös esim. äänimerkkejä (savumerkeistä en tiedä).

Omat OCR-kokeiluni olen aloittanut noin kymmenisen vuotta sitten. Tein silloin kotiautomaatioprojektia, jossa halusin myös vesimittarin lukeman digitaaliseen muotoon – ja mieluiten reaaliajassa. Tuossa tapauksessa en käyttänyt mitään valmiita kirjastoja, vaan “opetin” koodini tunnistamaan vesimittarissa käytettävät numerot. Siihen aikaan se oli vielä mekaaninen rullamittari. Hieman nihkeää pikselitason koodailua, mutta toimiva tuli. Ja reaaliajassa lukemat sai kiinni, kun webbikamera oli asennettuna vesimittarin päälle ja kameran livekuvasta tehtiin frame kerrallaan tunnistusta.

Nykypäivänä voidaan helposti tehdä tekstintunnistussovelluksia, joissa käytetään valmiina olevia OCR-tekoälykirjastoja. Nämä kirjastot ovat opetettu tunnistamaan erilaista tekstiä ja tukemaan eri kieliä. Samoissa kirjastoissa saattaa olla tuki myös muulle kuin OCR:lle, vaikkapa hahmontunnistus. Osa kirjastoista on myös sellaisia, että niitä voidaan jatko-opettaa. Esimerkiksi puuttuva kielituki saadaan, kun opetetaan uusi kieli itse. Näiden kirjastojen käytöllä oman koodin tuottamisen tarve on vähäinen ja (tekoäly)projektien aloituskynnys on matalalla.

Mikä oli sitten testauksen lopputulos? Jos lähdetään liikkeelle OpenCVSharp3 -kirjaston käytöstä USB-kameran kanssa, niin se toimi juuri niin kuin pitikin. Helppo käyttää ja omaa koodia tarvitaan melko vähän. Tesseract -kirjaston peruskäyttö on myös helppoa ja oman koodin tarve vähäinen. Tesseract on kuitenkin hirveän tarkka sisään menevästä syötteestä. Jos teet itse kuvan vaikkapa Paintilla ja laitat kuvaan tekstiä (ja vieläpä suoraan), niin sellaisen Tesseract tunnistaa virheettömästi. Jos taasen kuva tulee heikkolaatuiselta USB-kameralta livenä, niin kuvalle pitää tehdä monenmoista käsittelyä, että Tesseract tunnistaa siitä edes jotain. Suurin aika tässä testissä menikin kuvanlaadun säätämiseen ja kuvankäsittelyn koodaukseen.

Yhteenvetona voi todeta, että OCR:n käyttö livekameran kuvan kanssa on melko nopeaa ja helppoa, mutta kuvanlaatuun tulee panostaa. Jos kuvanlaatu olisi ollut hyvä, niin tekoälyn kanssa oman koodin tarve on vain murto-osa vanhaan vastaavaan toteutukseen verrattuna.

Nykyisin kaikissa uusissa vesimittareissa alkaa olemaan etäluentaominaisuudet toteutettuna esim. M-Bus -väylällä. Mielestäni kaikille käyttäjille, riippumatta kunnasta tai vesiosuuskunnasta, pitäisi tarjota mahdollisuus liittää uusi älykäs vesimittari lähiverkkoon, jolloin mittaukset saataisiin reaaliajassa. Tämä vähentäisi entisestään vesihuollon tarvetta ajella autolla ympäri kyliä lukemassa ”etämittareita”. Wireless M-Bus -väylän luentaetäisyyshän on kymmenistä satoihin metreihin, riippuen rakenteista ja kelistä. Ja mikä parasta, reaaliaikamittauksella saataisiin uutta dataa ja pohjaa uusille palveluille – vaikkapa softapohjainen vesivuotovahti.

Jos aihe herätti ajatuksia tai ideoita uusista projekteista, niin otapa yhteyttä!

Risto on Oiwan teknologiajohtaja, jolla on taipumusta luovaan ajatteluun ja tekemiseen. Tutustu Ristoon lisää täällä.