63 lines
1.2 KiB
Go
63 lines
1.2 KiB
Go
// Copyright (c) 2019 Alexander Medvednikov. All rights reserved.
|
|
// Use of this source code is governed by an MIT license
|
|
// that can be found in the LICENSE file.
|
|
|
|
import os
|
|
|
|
fn main() {
|
|
mut path = 'cinderella.txt'
|
|
if os.args.len != 2 {
|
|
println('usage: word_counter [text_file]')
|
|
println('using $path')
|
|
}
|
|
else {
|
|
path = os.args[1]
|
|
}
|
|
contents := os.read_file(path.trim_space()) or {
|
|
println('failed to open $path')
|
|
return
|
|
}
|
|
mut m := map[string]int{}
|
|
for word in contents.to_lower().split(' ') {
|
|
key := filter_word(word)
|
|
if key == '' {
|
|
continue
|
|
}
|
|
m[key] = m[key] + 1// TODO m[key]++
|
|
}
|
|
// Sort the keys
|
|
mut keys := []string
|
|
for e in m.entries {
|
|
keys << e.key
|
|
}
|
|
keys.sort()
|
|
// Print the map
|
|
for key in keys {
|
|
val := m[key]
|
|
println('$key => $val')
|
|
}
|
|
}
|
|
|
|
// Removes punctuation
|
|
fn filter_word(word string) string {
|
|
if word == '' || word == ' ' {
|
|
return ''
|
|
}
|
|
mut i := 0
|
|
for i < word.len && !is_letter(word[i]) {
|
|
i++
|
|
}
|
|
start := i
|
|
for i < word.len && is_letter(word[i]) {
|
|
i++
|
|
}
|
|
end := i
|
|
return word.substr(start, end)
|
|
}
|
|
|
|
// TODO remove once it's possible to call word[i].is_letter()
|
|
fn is_letter(c byte) bool {
|
|
return c.is_letter()
|
|
}
|
|
|