Kirjautuminen

Haku

Tehtävät

Keskustelu: Ohjelmointikysymykset: Ruby: Sensurointi, sanojen korvaus tähdillä

koodia111 [19.07.2018 23:08:19]

#

Moikka, olisi probleema yhden viope-kurssin tehtävän kanssa.

Tehtävä:
Luvun kolemannessa tehtävässä tehdään jälleen yleishyödyllisiä toimintoja, ja luodaan vähästä harmistuvia varten työkalu, jolla on helppo poistaa vaarallisia ajatuksia ja sanoja tekstistä. Toisin sanoen, teemme sensurointityökalun, jolla tuhma teksti voidaan muuttaa näppärästi ketään loukkaamattomaan muotoon.

Rakenteellisesti ohjelma on varsin yksinkertainen. Tiedostoon "6-3a_tiedosto.txt" on tallennettu sanoja tai merkkiyhdistelmiä yksi per rivi. Tiedostossa "6-3c_tiedosto.txt" on teksti, joka saattaa sisältää näitä sensuroitaviksi haluttavia sanoja tai kirjainyhdistelmiä. A-tiedoston sanat ja merkkiyhdistelmät siis luetaan taulukkoon, ja C-tiedoston tekstistä poistetaan kaikki A-taulukossa olevat sanat ja kirjainyhdistelmät, korvaten ne viidellä tähti (*****)-merkillä.

Kun vaihto on tehty, tulostetaan ruudulle teksti "Tallennetaan siistitty versio...", ja kirjoitetaan siistitty teksti tiedostoon "6-3b_tiedosto.txt". Lopuksi vielä tulostetaan ruudulle teksti "Valmis! Lopetetaan."

Toimiessaan oikein ohjelma tulostaa seuraavaa:

Example output:
Tallennetaan siistitty versio...
Valmis! Lopetetaan.


Ja tässä aikaansaannokseni:

tiedosto = File.read("6-3a_tiedosto.txt")

taulu = tiedosto
taulu = Array.new()

tiedostoo = File.read("6-3c_tiedosto.txt")
tiedostoon = tiedostoo.gsub(/taulu/, "*****")

puts "Tallennetaan siistitty versio..."

tiedosto = File.open("6-3c_tiedosto.txt","w")
tiedosto.puts(tiedostoon)
tiedosto.close
puts"Valmis! Lopetetaan."
 (Ruby)

En siis millään saa koodia toimimaan.. Osaisiko joku täällä auttaa minua tässä. Eli miten saan nuo tiedoston sanat muutettua viideksi tähdeksi ja tallennettua tiedostoo?

Metabolix [20.07.2018 18:32:47]

#

Sinun pitää vaikkapa lukea a-tiedoston rivit yksitellen ja joka rivin kohdalla korvata c-tiedoston tekstistä kyseinen sana tähdillä. Kurssin oppimateriaalissa varmasti kerrotaan, miten saat luettua tiedostosta kaikki rivit yksitellen ja miten pystyt käymään silmukassa nämä rivit läpi.

groovyb [21.07.2018 00:38:14]

#

a tiedoston rivejä ei toki tarvitse lukea yksitellen, vaan voi myös lukea koko merkkijonon ja splitata line breakillä arrayksi.
Tämän jälkeen luupataan array, ja loopin sisällä String.gsubilla korvataan c tiedostosta kaikki löytyneet vastaavuudet.

tiedosto = File.read("6-3a_tiedosto.txt")
tiedostoc = File.read("6-3c_tiedosto.txt")
sanat = tiedosto.split("\n").reject(&:empty?)
sanat.each do |sana|
tiedostoc = tiedostoc.gsub(sana, "*****")
end
puts tiedostoc

jos haluaa suoraan rivit, niin käytä tähän tyyliin

foo = File.open("tiedosto", "r")
foo.each_line do |rivi|
  puts rivi
end
foo.close

en tätä sen enempää testaillut, mutta tähän suuntaan.
Mikäli pitää huomioida isot ja pienet kirjaimet myös (jos tekstissä korvattava sana on vaikka lauseen alussa tai muuten sana joka alkaa isolla kirjaimella), pitää toki metsästää molemmat erikseen

koodia111 [21.07.2018 20:37:25]

#

@groovb kiitos näistä neuvoista ja kokeilen näitä tähän tehtävään. Tuolla siis saa sana- muuttujaan nuo sanat mitkä pitää korvata viidellä tähdellä, mutta tuo .gsub ei kuitenkaan näitä sanoja suostu korvaamaan..

Vastaus

Aihe on jo aika vanha, joten et voi enää vastata siihen.

Tietoa sivustosta