Tehtävä:
Luvun toisessa tehtävässä Työskellään tiedostojen kanssa ja tehdään yksinkertainen suodatin joka läpikäy tiedoston sisällön, järjestelee sen ja poistaa sieltä turhat merkinnät.
Tee ohjelma, joka lukee tiedostosta "7-2a_tiedosto.txt" listan sanoja, joita on aina yksi per rivi. Nämä sanat voivat olla mitä tahansa, ja ne saattaa esiintyä tiedostossa useaan kertaan. Tee ohjelma, joka lukee listan, poistaa sieltä kaikki ylimääräiset, useampaan kertaan olevat alkiot (1 kpl jätetään talteen), lajittelee sanat aakkosjärjestykseen ja tulostaa tuloksen tiedostoon "7-2b_tiedosto.txt". Toimiessaan oikein ohjelma ei tulosta mitään.
Jos oletetaan, että käsiteltävän tiedoston sisältö on seuraavanlainen:
kivitasku
nakki
suihkuturbiini
aapinen
avantgarde
lakana
zylofoni
celsius
byrokraatti
lukihäriö
mustikka
magneetti
kolikko
avantgarde
lakana
zylofoni
celsius
koivu
lusikka
kahvikuppi
salama
kotelo
puhelin
avaimet
lukihäriö
kahvikuppi
kahvikuppi
kahvikuppi
kahvikuppi
aapinen
... on siitä tuotettu siistitty ja suodatettu versio seuraavanlainen:
aapinenaapinen
avaimet
avantgarde
byrokraatti
celsius
kahvikuppi
kivitasku
koivu
kolikko
kotelo
lakana
lukihäriö
lusikka
magneetti
mustikka
nakki
puhelin
salama
suihkuturbiini
zylofoni
Example output:
Vastaus
#!/usr/bin/env ruby
# coding: utf-8
tiedostoIn = "7-2a_tiedosto.txt"
tiedostoOut = "7-2b_tiedosto.txt"
if (!File.exists?(tiedostoIn))
begin
File.open(tiedostoIn, File::RDWR|File::CREAT, 0644)
rescue
puts "Tiedostoon #{tiedostoIn} ei voida kirjoittaa"
Process.exit(1)
end
end
def kirjoita(tiedosto, sanat)
File.open(tiedosto, "w+:UTF-8") do |f|
f.flock(File::LOCK_EX)
sanat.each { |sana| f.puts sana }
end
end
kirjoita(tiedostoIn, ["kivitasku", "nakki", "suihkuturbiini", "aapinen", "avantgarde", "lakana", "zylofoni", "celsius", "byrokraatti", "lukihäriö", "mustikka", "magneetti", "kolikko", "avantgarde", "lakana", "zylofoni", "celsius", "koivu", "lusikka", "kahvikuppi", "salama", "kotelo", "puhelin", "avaimet", "lukihäriö", "kahvikuppi", "kahvikuppi", "kahvikuppi", "kahvikuppi", "aapinen"])
###############################
def jarjestaRivit(tiedostoLahde, tiedostoTulos)
sanalista = []
if (File.readable?(tiedostoLahde))
File.foreach(tiedostoLahde) do |line|
sanalista.insert(-1, line
end
end
kirjoita(tiedostoTulos, sanalista.sort.uniq)
end
jarjestaRivit(tiedostoIn, tiedostoOut)