Kirjoita ohjelma WordCount
, joka kysyy käyttäjältä tiedoston nimeä ja tulostaa kyseisessä tiedostossa olevien rivien, sanojen ja merkkien määrän.
Luettavan tiedoston on oltava Java-projektin juuressa. Esimerkiksi suorituksesta:
Anna tiedoston nimi: loremipsum.txt
Tiedostossa on:
2 riviä
8 sanaa
55 merkkiä
Esimerkissä on käytetty tiedostoa loremipsum.txt
:
Lorem ipsum dolor sit amet,
consectetur adipiscing elit.
Riveksi lasketaan myös tyhjät rivit ja merkeiksi myös välilyönnit. Sanojen laskemiseksi voit käyttää String-luokan split
-metodia, jolla pilkot kunkin rivin välilyöntien kohdalta. Huomaa kuitenkin, että tyhjällä rivillä ei saa laskea yhtään sanaa, vaikka split
-metodi palauttaakin yhden pituisen taulukon.
Voit hyödyntää omaa ohjelmaa testatessasi myös tekstitiedosto.txt-tiedostoa.
Anna tiedoston nimi: loremipsum.txt
Tiedostossa on:
2 riviä
8 sanaa
55 merkkiä
WordCount.java
import java.io.File;
import java.io.FileReader;
import java.io.IOException;
import java.io.BufferedReader;
import java.util.Arrays;
import java.util.Scanner;
public class WordCount {
public static void main(String[] args) {
Scanner syote = new Scanner(System.in);
System.out.print("Anna tiedoston nimi: ");
String tiedostoNimi = syote.next();
try {
File tiedosto = new File(System.getProperty("user.dir"), tiedostoNimi);
int i, rivit = 0, sanat = 0, merkit = 0;
FileReader lukija = new FileReader(tiedosto);
BufferedReader riviVirta = new BufferedReader(lukija);
String nykyRivi = riviVirta.readLine();
while (nykyRivi != null) {
// Laske rivit
rivit++;
if (!nykyRivi.isEmpty()) {
// Laske sanat
i = 0;
while (i < Arrays.asList(nykyRivi.split(" ")).size()) {
sanat++;
i++;
}
// Laske merkit
i = 0;
while (i < Arrays.asList(nykyRivi.split("")).size()) {
merkit++;
i++;
}
}
// Siirry seuraavaan riviin
nykyRivi = riviVirta.readLine();
}
lukija.close();
System.out.printf("Tiedostossa on:\n%d riviä\n%d sanaa\n%d merkkiä\n", rivit, sanat, merkit);
} catch (IOException e) {
System.err.printf("Tiedostoa %s ei löydy tai sen lukemisessa kävi virhe", tiedostoNimi);
}
}
}