Rdf-baasi ülesande nõuded: erinevus redaktsioonide vahel

Allikas: Lambda
Mine navigeerimisribale Mine otsikasti
Resümee puudub
Resümee puudub
 
(ei näidata sama kasutaja 15 vahepealset redaktsiooni)
1. rida: 1. rida:
''Vaata kindlasti lisaks seletust [[omadus-väärtus (ehk rdf) andmebaasidest]] ja [[rdf-baasi ülesande soovitusi ja nõuandeid  | soovitusi ja nõuandeid ]]  
''Vaata kindlasti lisaks seletust [[omadus-väärtus (ehk rdf) andmebaasidest]] ja [[rdf-baasi ülesande soovitusi ja nõuandeid  | soovitusi ja nõuandeid ]]  


'''Kokkuvõtlikult:''' loodav programm käivitatakse käsurealt, andes talle ette meie oma lihtsas päringukeeles lause (palju lihtsam, kui SQL) ,
'''Kokkuvõtlikult:''' loodav programm käivitatakse käsurealt, andes talle ette meie oma lihtsas päringukeeles (palju lihtsam, kui SQL) lause konkreetse
ning programm leiab seejärel lause tulemuse (kasutades samas kataloogis olevaid
otsingu  tegemiseks rdf failidest. Programm leiab seejärel lause tulemuse (kasutades samas kataloogis olevaid
csv-faile tabelitena) ja trükib selle välja.
csv-faile tabelitena) ja trükib selle välja.
NB! Ära unusta lugemast ka [[rdf-baasi lisaülesanne | rdf-baasi lisaülesannet]]


== Failid, kus andmed hoitakse ==
== Failid, kus andmed hoitakse ==
53. rida: 55. rida:
<pre>
<pre>
1,tyyp,auto,string
1,tyyp,auto,string
2,tyyp,auto,string
2,tyyp,auto,string
1,mark,opel,string
1,mark,opel,string
2,mark,cadillac,string
2,mark,cadillac,string
1,hind,100000,integer
1,hind,100000,integer
2,hind,500000,integer   
2,hind,500000,integer   
</pre>
</pre>


Arusaadavalt peab sinu programm <b>suutma töötada mistahes rdf-failidega ülalpool kirjeldatud kujul</b>, mitte ainult siintoodud kahe näitefailiga. Kindlasti tee katseks ise teistsuguseid
faile ja eksperimenteeri nendega!


* [[Media:andmed.csv | andmed.csv]]
NB!
* [[Media:autod.csv | autod.csv]]


Tekstifailidel on päis, selles mõttes, et
* Selline komaga eraldatud andmete esitamise formaat on väga harilik: seda nimetatakse CSV (comma separated values) ja te saate MS Exceli tabeleid selliselt kettale salvestada (Save as -> vali CSV formaat) ja ka lugeda.
esimene rida (muidu harilik CSV rida) sisaldab
* Eesti settingute korral kasutab Excel CSV formaadi salvestamise korral koma asemel semikoolonit ; (põhjus: komaga numbrid Eesti settingutes on komaga, kuid normaalsetes settingutes on komaga numbrid punktiga)
tulpade nimesid.
* Kui mõni string Exceli tabelis sisaldab koma, siis paneb Excel CSV-formaadis  salvestamisel selle ümber erandina jutumärgid.
* Kui mõni string Exceli tabelis sisaldab ise jutumärki, siis asendab Excel CSV-formaadis  salvestamisel selle topelt-jutumärgiga.


Programm (oletame, et ta nimeks on pandud myselect) niisiis:
Meie oma praktikumitöös eeldame lihtsuse mõttes, et stringides komasid ja jutumärke ei ole.
Sellega pääseme äsjakirjeldatud eranditest, st olukorrast, kus vahel stringidel jutumärgid
ümber ja stringi sisemised jutumärgid on asendatud topelt-jutumärgiga.


* Võimaldab anda päringu käsurea parameetrina näiteks nii:
== Mida programm peab suutma teha ==
  java myselect "select * from isik, amet where isik.amet=amet.ametinimi"
mispeale teostatakse päring ja trükitakse tulemus (päisega csv formaadis!) välja.


* Sisaldab kasulikku teeki (st hulka funktsioone), mida saaks kasutada teised programmid (umbes nagu Ecki TextIO klassi):
Programm peab suutma lahendada kahte erinevat ülesannet:
** SELECT päringu parsimiseks
** andmete lugemiseks failist
** parsitud päringu teostamiseks mälus 
** tulemuse väljatrükkimiseks


== SELECT päring ja mida sellega teha ==
* Arvutada kokku ja trükkida välja etteantud isiku koguvara, kasutades seejuures soovi korral  ühte lisatingimust (mis tüüpi/omadusega vara kokku liidame)
* Leida etteantud andmete hulgast kõige rikkam isik, kasutades jällegi  lisatingimust (mis tüüpi/omadusega vara kokku liidame).


Meie programm peab aru saama "hariliku" SQL keele SELECT päringu hästi lihtsustatud variandist.
Oletame, et panime programmi nimeks myrdf.  
Meie programmi jaoks on see SELECT lihtsalt üks string, mis tuleb lõhkuda vajalikeks tükkideks, tükid salvestada omaette abimassiivides ning seejärel kasutada neid abimassiive vastuse kokkupanekul.
Selleks, et seda sisulist ülesannet täita, peab programm myrdf konkreetselt tegema/sisaldama järgmist:


Meie SELECT lause süntaks:
=== Programm peab vastu võtma,  aru saama ja täitma käsureal antud päringuid (neli varianti): ===
 
  select * from fail1,...,failn where tulp1=vaartus1 and .... and tulpm=vaartusm
 
kus:
* iga 'fail' vastab kettal samas kataloogis olevale csv-failile sufiksiga csv.
* iga 'tulp' on ühe fail tulba päis, süntaksiga 'fail.tulp'
* iga 'vaartus' on üks kahest:
** konkreetne string apostroofide vahel, näiteks '20'
** omakorda tulp (ilma apostroofideta, näiteks amet.isikukood)
 
Pane tähele lihtsustavaid asjaolusid:
 
* lause algab alati fraasiga 'select * from'
* 'from' järel kuni 'where' (või stringi lõpuni) on komadega eraldatud failinime-algused
* 'where' järel on ainult 'and'-ga eraldatud 'tulp=väärtus' kujul tekstitükid.
 
 
=== Näited ja seletused ===
 
Toome kõigepelt paar näidet, eeldades, et meil on kettal kaks faili
 
isikud.csv:
 
  ikood,eesnimi,pereknimi,vanus,pikkus
  10,Jaan,Mets,32,170.5 
  50,Mihkel,Karu,21,180.4
  30,Anna Marie,Rebane,22,165
 
ametid.csv:
 
  amet,isikukood,palk
  koristaja,10,5000
  lektor,10,5000
  direktor,30,9000
 
Päring
 
  select * from isikud
 
trükib välja esimese tabeli (isikud.csv) täpselt, nagu ta on, kuid lisab päisetulpadele failinime algusotsa:
 
  isikud.ikood,isikud.eesnimi,isikud.pereknimi,isikud.vanus,isikud.pikkus
  10,Jaan,Mets,32,170.5 
  50,Mihkel,Karu,21,180.4
  30,Anna Marie,Rebane,22,165
 
 
Päring
 
  select * from isikud where isikud.vanus='21'
 
trükib ühe päisega rea esimesest tabelist:
 
  isikud.ikood,isikud.eesnimi,isikud.pereknimi,isikud.vanus,isikud.pikkus 
  50,Mihkel,Karu,21,180.4
 
Päring
 
  select * from ametid where ametid.palk='5000'
 
trükib kaks päisega rida teisest tabelist:
 
  ametid.amet, ametid.isikukood, ametid.palk
  koristaja,10,5000
  lektor,10,5000
 
Päring korraga '''kahest tabelist''' ilma where-piiranguteta ehitab tabeli, kus on kõigi esimese tabeli ja teise tabeli ridade kombinatsioonid (nn ristkorrutis):
 
  select * from isikud, ametid
 
trükib järgmise üheksa reaga tabeli (päiserida peab olema üksainus, aga järgnevas ta lihtsalt ei mahu ühele reale välja näitamiseks):
   
  isikud.ikood,isikud.eesnimi,isikud.pereknimi,isikud.vanus,isikud.pikkus,
  ametid.amet,ametid.isikukood,ametid.palk
  10,Jaan,Mets,32,170.5,koristaja,10,5000  
  10,Jaan,Mets,32,170.5,lektor,10,5000
  10,Jaan,Mets,32,170.5,direktor,30,9000
  50,Mihkel,Karu,21,180.4,koristaja,10,5000
  50,Mihkel,Karu,21,180.4,lektor,10,5000
  50,Mihkel,Karu,21,180.4,direktor,30,9000
  30,Anna Marie,Rebane,22,165,koristaja,10,5000
  30,Anna Marie,Rebane,22,165,lektor,10,5000
  30,Anna Marie,Rebane,22,165,direktor,30,9000
 
Pane tähele, et:
* Nii päis kui iga rida tulemuses on lihtsalt kahe sisend-tabeli rea järjest-summa
* Igale reale esimeses tabelis vastab kolm rida tulemuses (sest teises tabelis on samuti kolm rida: kui teises tabelis oleks seitse rida, siis vastaks igale esime tabeli reale seitse rida tulemuses).
 
Oletame, et meil on veel üks, kaherealine tabel:
 
koolid.csv:
 
  ikood,kool
  10,tty
  30,peda
 
ja päring üle kolme tabeli:
 
  select * from isikud, ametid, koolid
 
Siis tulemuses oleks juba 18 rida:
     
  isikud.ikood,isikud.eesnimi,isikud.pereknimi,isikud.vanus,isikud.pikkus,
  ametid.amet,ametid.isikukood,ametid.palk,koolid.ikood,koolid.kool
  10,Jaan,Mets,32,170.5,koristaja,10,5000,10,tty 
  10,Jaan,Mets,32,170.5,koristaja,10,5000,30,peda 
  10,Jaan,Mets,32,170.5,lektor,10,5000,10,tty 
  10,Jaan,Mets,32,170.5,lektor,10,5000,30,peda
  10,Jaan,Mets,32,170.5,direktor,30,9000,10,tty 
  10,Jaan,Mets,32,170.5,direktor,30,9000,30,peda
  50,Mihkel,Karu,21,180.4,koristaja,10,5000,10,tty 
  50,Mihkel,Karu,21,180.4,koristaja,10,5000,30,peda
  50,Mihkel,Karu,21,180.4,lektor,10,5000,10,tty 
  50,Mihkel,Karu,21,180.4,lektor,10,5000,30,peda
  50,Mihkel,Karu,21,180.4,direktor,30,9000,10,tty 
  50,Mihkel,Karu,21,180.4,direktor,30,9000,30,peda
  30,Anna Marie,Rebane,22,165,koristaja,10,5000,10,tty 
  30,Anna Marie,Rebane,22,165,koristaja,10,5000,30,peda
  30,Anna Marie,Rebane,22,165,lektor,10,5000,10,tty 
  30,Anna Marie,Rebane,22,165,lektor,10,5000,30,peda
  30,Anna Marie,Rebane,22,165,direktor,30,9000,10,tty 
  30,Anna Marie,Rebane,22,165,direktor,30,9000,30,peda
 
 
Võtame uuesti kahe tabeliga näite ja lisame talle ühe päringutingimuse, mis ütleb,
et isikud.ikood ja ametid.isikukood väärtused reas peavad kokku langema:
 
  select * from isikud, ametid where isikud.ikood=ametid.isikukood
 
trükib järgmise kolme sisureaga tabeli (päiserida peab olema üksainus, aga järgnevas ta lihtsalt ei mahu ühele reale välja näitamiseks):
   
  isikud.ikood,isikud.eesnimi,isikud.pereknimi,isikud.vanus,isikud.pikkus,
  ametid.amet,ametid.isikukood,ametid.palk
  10,Jaan,Mets,32,170.5,koristaja,10,5000 
  10,Jaan,Mets,32,170.5,lektor,10,5000
  30,Anna Marie,Rebane,22,165,direktor,30,9000
 
Kui viimast päringut veelgi piirata, näiteks nii:
 
  select * from isikud, ametid where isikud.ikood=ametid.isikukood and ametid.palk='5000'
 
saame tulemusse ainult kaks rida:
 
  isikud.ikood,isikud.eesnimi,isikud.pereknimi,isikud.vanus,isikud.pikkus,
  ametid.amet,ametid.isikukood,ametid.palk
  10,Jaan,Mets,32,170.5,koristaja,10,5000 
  10,Jaan,Mets,32,170.5,lektor,10,5000
 
Kui aga paneme where-tingimusse vastuolulise piirangu, näiteks:
 
  select * from isikud, ametid where ametid.palk='5000' and ametid.palk='keskmine'
 
siis (kuna string '5000' alati erineb stringist 'keskmine') saame alati vastuseks
tühja tabeli:
 
  isikud.ikood,isikud.eesnimi,isikud.pereknimi,isikud.vanus,isikud.pikkus,
  ametid.amet,ametid.isikukood,ametid.palk
 
== Olulised lihtsustused ==
 
Selles praktikumiülesandes eeldame,
et meil on kettal üks või mitu faili andmetega,
ning realisatsioon loeb nad hakatuseks
vajaduse järgi mällu ja alles seejärel asub
mälust vajalikke andmeid otsima.
 
Andmete kirjeldamist, muutmist
ja lisamist olemasolevatesse failidesse
selles ülesandes programmeerida ei ole vaja.
 
Kuna praktikumis ei jõuaks keegi
väga palju asju valmis programmeerida,
on vaja teha valmis ainult mõned, suhteliselt
lihtsad funktsioonid.
 
== Andmete esitus kettal ==
 
Meie süsteem eeldab, et andmed
on kettal failides, iga fail
esitab ühte tabelit:
   
   
* Iga fail koosneb tulpadest.
  myrdf "omabsumma andmed.csv where id=xx"
  myrdf "omabsumma andmed.csv where id=xx and omadus=vaartus"
  myrdf "kesomabmax andmed.csv"
  myrdf "kesomabmax andmed.csv where omadus=vaartus"
   
Seejuures võib <tt>andmed.csv</tt> asemele kirjutada mistahes failinime, mis selles kataloogis on,
<tt>xx</tt> asemele mistahes objekti identifikaatori (esimese tulba liige), <tt>omadus</tt> asemele
mistahes omatava asja omaduse (näiteks tyyp,mark vms) ja  <tt>tyybivaartus</tt> asemele mistahes
stringi.


* Faili iga rida (v.a. esimene rida) sisaldab ühte rida tabelist, ning tulpade vahel on kas koma või semikoolon: kumbat sinu programm eeldab (alati ühte kahest), see peab olema sinu programmi ühe globaablse muutujaga määratav.
Tekstiga <tt>omabsumma</tt> algav käsk peab summeerima etteantud isiku (tegelikult suvalise objekti)
 
vara (kasutades selleks <b>omab</b> seost  ning omatava objekti <b>hind</b> omadust andmefailis!),
* Esimene rida on muidu harilik CSV rida, kuid sinu teegifunktsioonid eeldavad, et esimene rida sisaldab tulpade nimesid, ja mitte sisulisi andmeid. Andmete sisselugemisel ja trükkimise juures loetakse ja trükitakse esimene rida loomulikult ka, samamoodi, kui kõik ülejäänud.
millel võib lisaks olla olemas etteantud omaduse etteantud väärtus, ja selle välja trükkima. Näiteks, kasutades meie eeltoodud
 
andmefaili, saame järgmised tulemused:
* Iga andmeühik on string ja ta ei ole failis pandud jutumärkide vahele.
 
* Üheski andmeühikus (stringis) ei  tohi esineda jutumärke ega eraldajat -  koma või  semikoolonit - muidu läheks  rea struktuur sassi.


Näide nelja tulba ja nelja reaga (neis esimene päiserida) failist kettal:


   eesnimi,pereknimi,vanus,pikkus
  myrdf "omabsumma andmed.csv where id=1"   trükib  <b>700000</b>
   Jaan,Mets,32,170.5 
  myrdf "omabsumma andmed.csv where id=2"   trükib  <b>2100000</b>
   Mihkel,Karu,21,180.4
  myrdf "omabsumma andmed.csv where id=3"  trükib  <b>0</b>
   Anna Marie,Rebane,22,165
  myrdf "omabsumma andmed.csv where id=2 and tyyp=maja"  trükib  <b>2000000</b>
  myrdf "omabsumma andmed.csv where id=2 and tyyp=auto"   trükib  <b>100000</b>
  myrdf "omabsumma andmed.csv where id=1 and tyyp=traktor"  trükib  <b>0</b>
  myrdf "omabsumma andmed.csv where id=1 and mark=cadillac"  trükib   <b>500000</b>


Pane tähele, et stringides tohivad olla tühikud (näiteks nimes Anna Marie).


Tekstiga <tt>kesomabmax</tt> algav käsk peab leidma objekti, kelle vara  (kasutades sedasama <b>omab</b> seost ning omatava objekti <b>hind</b> seost andmefailis!),
on kõige suurem, ja selle objekti identifikaatori (esimese rea sisu) välja trükkima. Kui käsule on antud lisatingimus,
siis tuleb varade summeerimisel kasutada ainult selle tingimusega klappivat väärtust. Jällegi, kasutades meie eeltoodud
andmefaili, saame järgmised tulemused:


NB!
  myrdf "kesomabmax andmed.csv"  trükib  <b>2</b>
  myrdf "kesomabmax andmed.csv" where tyyp=auto  trükib  <b>1</b>
  myrdf "kesomabmax andmed.csv" where mark=cadillac  trükib  <b>1</b>
  myrdf "kesomabmax andmed.csv" where mark=opel  trükib  <b>2</b>
  myrdf "kesomabmax andmed.csv" where tyyp=traktor  trükib  <b>null</b>


* Selline andmete esitamise formaat on väga harilik: seda nimetatakse CSV (comma separated values) ja te saate MS Exceli tabeleid selliselt kettale salvestada (Save as -> vali CSV formaat) ja ka lugeda.
NB! Tingimuseks on alati ainult võrdus, mingeid väiksem/suurem/vms tingimusi ei ole vaja realiseerida. Samuti piisab üheainsa tingimuse
 
realiseerimisest (ehk, sinu programm ei pea aru saama käskudest nagu "omabsumma andmed.csv where id=1 and tyyp=auto and mark=cadillac" )
* Eesti settingute korral kasutab Excel CSV formaadi salvestamise korral koma asemel semikoolonit ; (põhjus: komaga numbrid Eesti settingutes on komaga, kuid normaalsetes settingutes on komaga numbrid punktiga)
 
* Kui mõni string Exceli tabelis sisaldab koma, siis paneb Excel CSV-formaadis  salvestamisel selle ümber erandina jutumärgid.


* Kui mõni string Exceli tabelis sisaldab ise jutumärki, siis asendab Excel CSV-formaadis  salvestamisel selle topelt-jutumärgiga.
=== Programm peab sisaldama kasulikku teeki (st hulka funktsioone), mida saaks kasutada teised programmid (umbes nagu Ecki TextIO klassi): ===


* Funktsiooni <b>String rdf_omabsumma(String failinimi, String id, String omadus, String vaartus)</b>,  mis annab tulemuseks otsitava stringi, täpselt
analoogiliselt eelkirjeldatuga. Juhul, kui argument <b>omadus</b> on kas <tt>null</tt> või tühi string <tt>""</tt>, summeeritakse üle kõigi
omatavate objektide (st tingimust ei arvestata).


Meie oma praktikumitöös eeldame lihtsuse mõttes,
* Funktsiooni <b>String rdf_kesomabmax(String failinimi, String omadus, String vaartus)</b>,  mis annab tulemuseks otsitava stringi, täpselt
et stringides komasid ja jutumärke ei ole.
analoogiliselt eelkirjeldatuga. Juhul, kui argument <b>omadus</b> on kas <tt>null</tt> või tühi string <tt>""</tt>, summeeritakse üle kõigi
Sellega pääseme äsjakirjeldatud eranditest,
omatavate objektide (st tingimust ei arvestata).
st olukorrast, kus vahel stringidel jutumärgid
ümber ja stringi sisemised jutumärgid on
asendatud topelt-jutumärgiga.


== Vigade töötlus ==
== Vigade töötlus ==
318. rida: 150. rida:
ei pea kasutama täpselt sellist vigade
ei pea kasutama täpselt sellist vigade
"kataloogi" ja veateateid):
"kataloogi" ja veateateid):


* päringu süntaks on vale
* päringu süntaks on vale
* päringus nõutud faili ei leitud
* päringus nõutud faili ei leitud
* päringus nõutud faili ei saa avada
* päringus nõutud faili ei saa avada
* faili ridades on erinev tulpade arv
* faili ridades on vale tulpade arv
* faili päisereas puudub päringus nõutud tulp
 
 
== Soovitusi ja ideid programmeerimiseks ==
 
Kõige olulisem on soovitus töö järjekorra kohta:
 
* Programmeeri kõigepealt valmis faili massiivi lugemise funktsioon (tingimata tee selleks eraldi funktsioon!),  katseta, et käiks ok.
* Seejärel programmeeri valmis <b>String rdf_omabsumma(String failinimi, String id, String omadus, String vaartus)</b>,alustades lihtsamast juhust: tingimusi pole, uri-dega midagi ei viidata jne. Kui see lihtne variant käib, lisa  uri-dega tegutsemine ja lõpuks tingimused.
* Seejärel programmeeri käsurea töötlus, mis lõpuks kutsub välja varem tehtud funktsiooni rdf_omabsumma.
* Nüüd tee valmis funktsioon <b>String rdf_kesomabmax(String failinimi, String omadus, String vaartus)</b>,  mis jällegi kasutab varem tehtud funktsiooni  rdf_omabsumma.
* Lõpuks tee valmis käsurea-töötlus kesomabmax jaoks, kasutades vastuse leidmiseks muidugi  funktsiooni rdf_kesomabmax
 
Detailsemalt loe eraldi [[rdf-baasi ülesande soovitusi ja nõuandeid  | soovitusi ja nõuandeid ]] selle ülesande jaoks.

Viimane redaktsioon: 18. oktoober 2006, kell 12:01

Vaata kindlasti lisaks seletust omadus-väärtus (ehk rdf) andmebaasidest ja soovitusi ja nõuandeid

Kokkuvõtlikult: loodav programm käivitatakse käsurealt, andes talle ette meie oma lihtsas päringukeeles (palju lihtsam, kui SQL) lause konkreetse otsingu tegemiseks rdf failidest. Programm leiab seejärel lause tulemuse (kasutades samas kataloogis olevaid csv-faile tabelitena) ja trükib selle välja.

NB! Ära unusta lugemast ka rdf-baasi lisaülesannet

Failid, kus andmed hoitakse

Sinu programm peab andmefailidena kasutama sellessamas kataloogis, kus programmi käivitad, olevaid faile. Seega ei ole faile vaja anda täispathiga, piisab nimest. Failid on lihtsalt tekstifailid, formaadiga CSV (comma separated values, sellisteks saab salvestada näiteks Exceli faile), ning nad sisaldavad rdf-andmeid, neljas tulbas, täpselt selles järjekorras ja tüübinimedega (uri,string,integer) nagu on seletatud jutus omadus-väärtus (ehk rdf) andmebaasidest. Päiserida failil ei ole: esimene rida on kohe rdf-info rida. Tühikud enne ja pärast koma tuleb töötlusel elimineerida: rida

 
   200  ,   nimi,  Arvo Meister  ,string

on sisuliselt ekvivalentne reaga

 
200,nimi,Arvo Meister,string

Esimese näitefailina (andmed.csv) võid kasuda jutus omadus-väärtus (ehk rdf) andmebaasidest selgitatud sisu:

1,nimi,Arvo,string
2,nimi,Jaan,string
1,vanus,18,integer
2,vanus,20,integer
1,pikkus,185,integer
2,isikukood,38410122641,string
1,amet,3,uri
1,amet,4,uri
2,amet,5,uri
3,nimi,ehitaja,string
4,nimi,valvur,string
5,nimi,valvur,string
3,palk,15000,integer
4,palk,6000,integer
5,palk,2000,integer
1,omab,7,uri
2,omab,10,uri
7,tyyp,auto,string
7,mark,ford
7,hind,200000,integer
10,tyyp,maja,string
10,hind,2000000,integer 
1,omab,autod.csv#2,uri
2,omab,autod.csv#1,uri

Teise näitefailina (autod.csv) võid kasutada järgmist sisu:

1,tyyp,auto,string
2,tyyp,auto,string
1,mark,opel,string
2,mark,cadillac,string
1,hind,100000,integer
2,hind,500000,integer  

Arusaadavalt peab sinu programm suutma töötada mistahes rdf-failidega ülalpool kirjeldatud kujul, mitte ainult siintoodud kahe näitefailiga. Kindlasti tee katseks ise teistsuguseid faile ja eksperimenteeri nendega!

NB!

  • Selline komaga eraldatud andmete esitamise formaat on väga harilik: seda nimetatakse CSV (comma separated values) ja te saate MS Exceli tabeleid selliselt kettale salvestada (Save as -> vali CSV formaat) ja ka lugeda.
  • Eesti settingute korral kasutab Excel CSV formaadi salvestamise korral koma asemel semikoolonit ; (põhjus: komaga numbrid Eesti settingutes on komaga, kuid normaalsetes settingutes on komaga numbrid punktiga)
  • Kui mõni string Exceli tabelis sisaldab koma, siis paneb Excel CSV-formaadis salvestamisel selle ümber erandina jutumärgid.
  • Kui mõni string Exceli tabelis sisaldab ise jutumärki, siis asendab Excel CSV-formaadis salvestamisel selle topelt-jutumärgiga.

Meie oma praktikumitöös eeldame lihtsuse mõttes, et stringides komasid ja jutumärke ei ole. Sellega pääseme äsjakirjeldatud eranditest, st olukorrast, kus vahel stringidel jutumärgid ümber ja stringi sisemised jutumärgid on asendatud topelt-jutumärgiga.

Mida programm peab suutma teha

Programm peab suutma lahendada kahte erinevat ülesannet:

  • Arvutada kokku ja trükkida välja etteantud isiku koguvara, kasutades seejuures soovi korral ühte lisatingimust (mis tüüpi/omadusega vara kokku liidame)
  • Leida etteantud andmete hulgast kõige rikkam isik, kasutades jällegi lisatingimust (mis tüüpi/omadusega vara kokku liidame).

Oletame, et panime programmi nimeks myrdf. Selleks, et seda sisulist ülesannet täita, peab programm myrdf konkreetselt tegema/sisaldama järgmist:

Programm peab vastu võtma, aru saama ja täitma käsureal antud päringuid (neli varianti):

  myrdf "omabsumma andmed.csv where id=xx"
  myrdf "omabsumma andmed.csv where id=xx and omadus=vaartus"
  myrdf "kesomabmax andmed.csv"
  myrdf "kesomabmax andmed.csv where omadus=vaartus"
    

Seejuures võib andmed.csv asemele kirjutada mistahes failinime, mis selles kataloogis on, xx asemele mistahes objekti identifikaatori (esimese tulba liige), omadus asemele mistahes omatava asja omaduse (näiteks tyyp,mark vms) ja tyybivaartus asemele mistahes stringi.

Tekstiga omabsumma algav käsk peab summeerima etteantud isiku (tegelikult suvalise objekti) vara (kasutades selleks omab seost ning omatava objekti hind omadust andmefailis!), millel võib lisaks olla olemas etteantud omaduse etteantud väärtus, ja selle välja trükkima. Näiteks, kasutades meie eeltoodud andmefaili, saame järgmised tulemused:


  myrdf "omabsumma andmed.csv where id=1"   trükib   700000
  myrdf "omabsumma andmed.csv where id=2"   trükib   2100000
  myrdf "omabsumma andmed.csv where id=3"   trükib   0
  myrdf "omabsumma andmed.csv where id=2 and tyyp=maja"   trükib   2000000
  myrdf "omabsumma andmed.csv where id=2 and tyyp=auto"   trükib   100000
  myrdf "omabsumma andmed.csv where id=1 and tyyp=traktor"   trükib   0
  myrdf "omabsumma andmed.csv where id=1 and mark=cadillac"   trükib   500000


Tekstiga kesomabmax algav käsk peab leidma objekti, kelle vara (kasutades sedasama omab seost ning omatava objekti hind seost andmefailis!), on kõige suurem, ja selle objekti identifikaatori (esimese rea sisu) välja trükkima. Kui käsule on antud lisatingimus, siis tuleb varade summeerimisel kasutada ainult selle tingimusega klappivat väärtust. Jällegi, kasutades meie eeltoodud andmefaili, saame järgmised tulemused:

 myrdf "kesomabmax andmed.csv"   trükib   2
 myrdf "kesomabmax andmed.csv" where tyyp=auto   trükib   1
 myrdf "kesomabmax andmed.csv" where mark=cadillac   trükib   1
 myrdf "kesomabmax andmed.csv" where mark=opel   trükib   2
 myrdf "kesomabmax andmed.csv" where tyyp=traktor   trükib   null

NB! Tingimuseks on alati ainult võrdus, mingeid väiksem/suurem/vms tingimusi ei ole vaja realiseerida. Samuti piisab üheainsa tingimuse realiseerimisest (ehk, sinu programm ei pea aru saama käskudest nagu "omabsumma andmed.csv where id=1 and tyyp=auto and mark=cadillac" )

Programm peab sisaldama kasulikku teeki (st hulka funktsioone), mida saaks kasutada teised programmid (umbes nagu Ecki TextIO klassi):

  • Funktsiooni String rdf_omabsumma(String failinimi, String id, String omadus, String vaartus), mis annab tulemuseks otsitava stringi, täpselt

analoogiliselt eelkirjeldatuga. Juhul, kui argument omadus on kas null või tühi string "", summeeritakse üle kõigi omatavate objektide (st tingimust ei arvestata).

  • Funktsiooni String rdf_kesomabmax(String failinimi, String omadus, String vaartus), mis annab tulemuseks otsitava stringi, täpselt

analoogiliselt eelkirjeldatuga. Juhul, kui argument omadus on kas null või tühi string "", summeeritakse üle kõigi omatavate objektide (st tingimust ei arvestata).

Vigade töötlus

Mistahes vigade ilmnemisel ei tohi programm nö kokku kukkuda või anda Java enda, süsteemset veateadet, millest kasutaja aru ei saa.

Vead tuleb kinni püüda (kas if-dega kontrollides või try ... catch-i kasutades) ning anda kasutajale arusaadav veateade.

Millised on vead, mis võivad juhtuda (näited: ei pea kasutama täpselt sellist vigade "kataloogi" ja veateateid):

  • päringu süntaks on vale
  • päringus nõutud faili ei leitud
  • päringus nõutud faili ei saa avada
  • faili ridades on vale tulpade arv


Soovitusi ja ideid programmeerimiseks

Kõige olulisem on soovitus töö järjekorra kohta:

  • Programmeeri kõigepealt valmis faili massiivi lugemise funktsioon (tingimata tee selleks eraldi funktsioon!), katseta, et käiks ok.
  • Seejärel programmeeri valmis String rdf_omabsumma(String failinimi, String id, String omadus, String vaartus),alustades lihtsamast juhust: tingimusi pole, uri-dega midagi ei viidata jne. Kui see lihtne variant käib, lisa uri-dega tegutsemine ja lõpuks tingimused.
  • Seejärel programmeeri käsurea töötlus, mis lõpuks kutsub välja varem tehtud funktsiooni rdf_omabsumma.
  • Nüüd tee valmis funktsioon String rdf_kesomabmax(String failinimi, String omadus, String vaartus), mis jällegi kasutab varem tehtud funktsiooni rdf_omabsumma.
  • Lõpuks tee valmis käsurea-töötlus kesomabmax jaoks, kasutades vastuse leidmiseks muidugi funktsiooni rdf_kesomabmax

Detailsemalt loe eraldi soovitusi ja nõuandeid selle ülesande jaoks.