diff options
Diffstat (limited to 'v_windows/v/examples/word_counter/word_counter.v')
-rw-r--r-- | v_windows/v/examples/word_counter/word_counter.v | 70 |
1 files changed, 70 insertions, 0 deletions
diff --git a/v_windows/v/examples/word_counter/word_counter.v b/v_windows/v/examples/word_counter/word_counter.v new file mode 100644 index 0000000..fc60a6f --- /dev/null +++ b/v_windows/v/examples/word_counter/word_counter.v @@ -0,0 +1,70 @@ +// Copyright (c) 2019-2021 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 extract_words(contents) { + m[word]++ + } + // Sort the keys + mut keys := m.keys() + keys.sort() + // Print the map + for key in keys { + val := m[key] + println('$key => $val') + } +} + +// Creates an array of words from a given string +fn extract_words(contents string) []string { + mut splitted := []string{} + for space_splitted in contents.to_lower().split(' ') { + if space_splitted.contains('\n') { + splitted << space_splitted.split('\n') + } else { + splitted << space_splitted + } + } + + mut results := []string{} + for s in splitted { + result := filter_word(s) + if result == '' { + continue + } + results << result + } + + return results +} + +// Removes punctuation +fn filter_word(word string) string { + if word == '' || word == ' ' { + return '' + } + mut i := 0 + for i < word.len && !word[i].is_letter() { + i++ + } + start := i + for i < word.len && word[i].is_letter() { + i++ + } + end := i + return word[start..end] +} |