Код: Выделить всё
(in-package :cl-user)
(defparameter *результаты* (make-hash-table :test 'equalp))
(defparameter *разделители*
(format nil "\"\|<>'.:,-;(){}[]^&+*/!~~#$ %=?~A" #\Tab))
(defun разделитель-ли (б)
(find б *разделители*))
(defun посчитай-слова-в-A2 (шаблон-имён-файлов имя-файла-отчёта)
(let* ((файлы (directory шаблон-имён-файлов)))
(dolist (ф файлы)
(посчитай-в-одном ф))
(отфильтруй-результаты)
(выведи-отчёт имя-файла-отчёта)
(values)))
(defun выкинуть-это-слово-ли (слово)
(cond
((find (elt слово 0) "0123456789")
t)
((= (length слово) 1)
t)
((every (lambda (б) (find б "0123456789")) слово)
t)
((and (find #\0 слово)
(find #\h слово :test 'equalp)
(every (lambda (б) (find б "01234567890ABCDEFH")) слово))
t)
((and (= (length слово) 8)
(every (lambda (б) (find б "01234567890ABCDEF")) слово))
t)
(t
nil)))
(defun отфильтруй-результаты ()
(maphash (lambda (к з)
(declare (ignore з))
(when (выкинуть-это-слово-ли к)
(remhash к *результаты*)))
*результаты*))
(defun выведи-отчёт (имя-файла-отчёта)
(with-open-file (в имя-файла-отчёта
:direction :output
:if-does-not-exist :create
:if-exists :supersede)
(maphash
(lambda (к з)
(print `(,к ,з) в))
*результаты*)))
(defun посчитай-долю-русских ()
(let ((к-во-русских 0)
(к-во-всего 0))
(maphash
(lambda (к з)
(when (some 'russian-budden-tools:cyrillic-char-p к)
(incf к-во-русских))
(incf к-во-всего))
*результаты*)
(format t "~&Русских: ~A, всего: ~A, доля = ~A"
к-во-русских
к-во-всего
(float (/ к-во-русских (+ 0.01 к-во-всего))))))
(defun посчитай-в-одном (имя-файла)
(with-open-file (ч имя-файла :direction :input)
(loop
(let* ((строка (read-line ч nil nil))
(кнф (null строка)))
(when кнф (return))
(let* ((слова
(split-sequence:split-sequence-if #'разделитель-ли
строка
:remove-empty-subseqs t)))
(dolist (слово слова)
(cond ((gethash слово *результаты*)
(incf (gethash слово *результаты*)))
(t
(setf (gethash слово *результаты*) 1)))))))))
(посчитай-слова-в-A2 "c:/ob/jaos/source/*.Mod" "c:/ob/отчёт.текст")
(посчитай-долю-русских)